package go.kr.project.api.controller;

import go.kr.project.api.model.Envelope;
import go.kr.project.api.model.request.NewBasicRequest;
import go.kr.project.api.model.request.NewLedgerRequest;
import go.kr.project.api.model.response.NewBasicResponse;
import go.kr.project.api.model.response.NewLedgerResponse;
import go.kr.project.api.service.ExternalVehicleApiService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;

/**
 * 자동차 정보 연계 REST 컨트롤러 (Swagger 문서화 및 테스트용)
 *
 * <p>설정(vmis.integration.mode)에 따라 Internal/External 모드로 분기하여 호출합니다.</p>
 * <p>중요: 모드별 분기는 VehicleInfoService 구현체가 자동으로 처리하므로, 컨트롤러는 단순히 서비스에 위임합니다.</p>
 *
 * <h3>모드별 자동 분기:</h3>
 * <ul>
 *   <li><strong>Internal Mode:</strong> 내부 VMIS 모듈 직접 호출 (정부 API 형식 유지)</li>
 *   <li><strong>External Mode:</strong> 외부 VMIS-interface REST API 호출</li>
 * </ul>
 *
 * <h3>API 경로:</h3>
 * <ul>
 *   <li>POST /api/v1/vehicles/info.ajax - 자동차 기본정보+등록원부 통합 조회</li>
 *   <li>POST /api/v1/vehicles/basic.ajax - 자동차 기본사항만 조회</li>
 *   <li>POST /api/v1/vehicles/ledger.ajax - 자동차 등록원부(갑)만 조회</li>
 * </ul>
 *
 * 중요: 이 컨트롤러는 Swagger 문서/테스트용으로 제공됩니다.
 */
@RestController
@RequestMapping("/api/v1/vehicles")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "VMIS 차량정보 (Swagger)", description = "외부 호출")
public class VehicleInterfaceController {

    private final ExternalVehicleApiService service;

    /**
     * 자동차 기본사항만 조회
     * - 중요 로직: VehicleInfoService에 완전히 위임하여 모드별 분기는 서비스 구현체가 자동 처리
     */
    @PostMapping(value = "/basic.ajax", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    @Operation(
            summary = "자동차기본사항조회 (단독)",
            description = "YAML 설정(vmis.external.api.url.basic.old-or-new)에 따라 old/new API를 자동 호출하여 기본정보만 조회",
            requestBody = @RequestBody(
                    content = @Content(
                            mediaType = MediaType.APPLICATION_JSON_VALUE,
                            examples = @ExampleObject(
                                    name = "기본사항조회 예제 (자동차번호)",
                                    value = "{\n" +
                                            "  \"data\": [{\n" +
                                            "      \"record\": [{\n" +
                                            "          \"INQ_SE_CD\": \"자동설정: VHRNO not null → 3:자동차번호, VIN not null → 2:차대번호\",\n" +
                                            "          \"LEVY_CRTR_YMD\": \"20250101\",\n" +
                                            "          \"VHRNO\": \"차량번호\",\n" +
                                            "          \"VIN\": null\n" +
                                            "        }]\n" +
                                            "    }]\n" +
                                            "}"
                            )
                    )
            )
    )
    public ResponseEntity<Envelope<NewBasicResponse>> basic(
            @org.springframework.web.bind.annotation.RequestBody Envelope<NewBasicRequest> envelope
    ) {
        // Envelope에서 NewBasicRequest 추출
        NewBasicRequest request = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0) : null;
        if (request == null || request.getRecord() == null || request.getRecord().isEmpty()) {
            return ResponseEntity.ok(new Envelope<>(Collections.emptyList()));
        }

        // YAML 설정에 따라 old/new API 자동 선택
        NewBasicResponse basic = service.getBasicInfo(request);
        Envelope<NewBasicResponse> out = (basic != null) ? new Envelope<>(basic) : new Envelope<>(Collections.emptyList());
        return ResponseEntity.ok(out);
    }

    /**
     * 자동차 등록원부(갑)만 조회
     * - 중요 로직: VehicleInfoService에 완전히 위임하여 모드별 분기는 서비스 구현체가 자동 처리
     */
    @PostMapping(value = "/ledger.ajax", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    @Operation(
            summary = "자동차등록원부(갑) 조회 (단독)",
            description = "YAML 설정(vmis.external.api.url.ledger.old-or-new)에 따라 old/new API를 자동 호출하여 등록원부만 조회",
            requestBody = @RequestBody(
                    content = @Content(
                            mediaType = MediaType.APPLICATION_JSON_VALUE,
                            examples = @ExampleObject(
                                    name = "등록원부 조회 예제",
                                    value = "{\n" +
                                            "  \"data\": [\n" +
                                            "    {\n" +
                                            "      \"VHRNO\": \"차량번호\",\n" +
                                            "      \"PRVC_RLS\": \"1\",\n" +
                                            "      \"CVLPR_NM\": \"홍길동\",\n" +
                                            "      \"CVLPR_IDECNO\": \"8801011234567\",\n" +
                                            "      \"CVLPR_STDG_CD\": \"1111011700\",\n" +
                                            "      \"DSCTN_INDCT\": \"1\",\n" +
                                            "      \"INQ_SE_CD\": \"1\"\n" +
                                            "    }\n" +
                                            "  ]\n" +
                                            "}"
                            )
                    )
            )
    )
    public ResponseEntity<Envelope<NewLedgerResponse>> ledger(
            @org.springframework.web.bind.annotation.RequestBody Envelope<NewLedgerRequest> envelope
    ) {
        // Envelope에서 NewLedgerRequest 추출
        NewLedgerRequest request = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0) : null;
        if (request == null || request.getVhrno() == null || request.getVhrno().trim().isEmpty()) {
            return ResponseEntity.ok(new Envelope<>(Collections.emptyList()));
        }

        // YAML 설정에 따라 old/new API 자동 선택
        NewLedgerResponse ledger = service.getLedgerInfo(request);
        Envelope<NewLedgerResponse> out = (ledger != null) ? new Envelope<>(ledger) : new Envelope<>(Collections.emptyList());
        return ResponseEntity.ok(out);
    }
}
