package com.saas.voip.controller;

import com.saas.voip.dto.request.CreateVapiAssistantRequest;
import com.saas.voip.dto.response.VapiAssistantResponse;
import com.saas.voip.service.provider.vapi.VapiService;
import com.saas.shared.dto.common.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * REST Controller for Vapi.ai assistant management.
 * 
 * Path: /api/tenant/ai-assistants/vapi
 * Role: TENANT_USER only
 * 
 * Endpoints:
 * - POST   /           Create new assistant
 * - GET    /           List all assistants
 * - GET    /{id}       Get assistant details
 * - PUT    /{id}       Update assistant
 * - DELETE /{id}       Delete assistant
 */
@RestController
@RequestMapping("/api/tenant/ai-assistants/vapi")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "Vapi Assistants", description = "Manage Vapi.ai assistants")
@SecurityRequirement(name = "Bearer Authentication")
public class TenantVapiAssistantController {

    private final VapiService vapiService;

    @PostMapping
    @Operation(summary = "Create Vapi assistant", description = "Create new AI assistant on Vapi platform")
    @ApiResponses(value = {
        @io.swagger.v3.oas.annotations.responses.ApiResponse(
            responseCode = "201",
            description = "Assistant created successfully",
            content = @Content(schema = @Schema(implementation = ApiResponse.class))
        ),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "Validation error"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "503", description = "Vapi API unavailable")
    })
    public ResponseEntity<ApiResponse<VapiAssistantResponse>> createAssistant(
            @Valid @RequestBody CreateVapiAssistantRequest request) {
        log.info("Creating Vapi assistant: {}", request.getName());

        VapiAssistantResponse response = vapiService.createAssistant(request);

        return ResponseEntity.status(HttpStatus.CREATED)
            .body(ApiResponse.success(response, "Vapi assistant created successfully"));
    }

    @GetMapping
    @Operation(summary = "List Vapi assistants", description = "Retrieve all assistants from Vapi")
    @ApiResponses(value = {
        @io.swagger.v3.oas.annotations.responses.ApiResponse(
            responseCode = "200",
            description = "Assistants retrieved successfully",
            content = @Content(schema = @Schema(implementation = ApiResponse.class))
        ),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "503", description = "Vapi API unavailable")
    })
    public ResponseEntity<ApiResponse<List<VapiAssistantResponse>>> listAssistants() {
        log.info("Fetching Vapi assistants");

        List<VapiAssistantResponse> assistants = vapiService.fetchAssistantsFromApi();

        return ResponseEntity.ok()
            .body(ApiResponse.success(assistants, "Vapi assistants retrieved successfully"));
    }

    @GetMapping("/{assistantId}")
    @Operation(summary = "Get Vapi assistant", description = "Retrieve specific Vapi assistant by ID")
    @ApiResponses(value = {
        @io.swagger.v3.oas.annotations.responses.ApiResponse(
            responseCode = "200",
            description = "Assistant found",
            content = @Content(schema = @Schema(implementation = ApiResponse.class))
        ),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "Assistant not found"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "503", description = "Vapi API unavailable")
    })
    public ResponseEntity<ApiResponse<VapiAssistantResponse>> getAssistant(
            @Parameter(description = "Vapi assistant ID", example = "assistant_abc123")
            @PathVariable String assistantId) {
        log.info("Fetching Vapi assistant: {}", assistantId);

        VapiAssistantResponse response = vapiService.getAssistant(assistantId);

        return ResponseEntity.ok()
            .body(ApiResponse.success(response, "Vapi assistant retrieved successfully"));
    }

    @PutMapping("/{assistantId}")
    @Operation(summary = "Update Vapi assistant", description = "Update existing Vapi assistant configuration")
    @ApiResponses(value = {
        @io.swagger.v3.oas.annotations.responses.ApiResponse(
            responseCode = "200",
            description = "Assistant updated successfully",
            content = @Content(schema = @Schema(implementation = ApiResponse.class))
        ),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "Validation error"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "Assistant not found"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "503", description = "Vapi API unavailable")
    })
    public ResponseEntity<ApiResponse<VapiAssistantResponse>> updateAssistant(
            @Parameter(description = "Vapi assistant ID", example = "assistant_abc123")
            @PathVariable String assistantId,
            @Valid @RequestBody CreateVapiAssistantRequest request) {
        log.info("Updating Vapi assistant: {}", assistantId);

        VapiAssistantResponse response = vapiService.updateAssistant(assistantId, request);

        return ResponseEntity.ok()
            .body(ApiResponse.success(response, "Vapi assistant updated successfully"));
    }

    @DeleteMapping("/{assistantId}")
    @Operation(summary = "Delete Vapi assistant", description = "Remove Vapi assistant")
    @ApiResponses(value = {
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "204", description = "Assistant deleted successfully"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "Unauthorized"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "Forbidden"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "Assistant not found"),
        @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "503", description = "Vapi API unavailable")
    })
    public ResponseEntity<Void> deleteAssistant(
            @Parameter(description = "Vapi assistant ID", example = "assistant_abc123")
            @PathVariable String assistantId) {
        log.info("Deleting Vapi assistant: {}", assistantId);

        vapiService.deleteAssistant(assistantId);

        return ResponseEntity.noContent().build();
    }
}
