package go.kr.project.carInspectionPenalty.callApi.controller;

import egovframework.constant.TilesConstants;
import egovframework.util.ApiResponseUtil;
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.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

/**
 * 차량 정보 조회 컨트롤러
 * 자동차 기본정보, 등록원부, 통합 조회 기능을 제공합니다.
 */
@Controller
@RequestMapping("/carInspectionPenalty/callApi")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "차량 정보 조회", description = "차량 정보 조회 API")
public class VehicleInquiryController {

    private final ExternalVehicleApiService service;

    /**
     * 차량 정보 조회 화면
     */
    @GetMapping("/inquiry.do")
    public String inquiryPage(Model model) {
        log.debug("차량 정보 조회 화면 진입");
        return "carInspectionPenalty/callApi/inquiry" + TilesConstants.BASE;
    }

    /**
     * 자동차 기본사항 조회 (단독)
     * YAML 설정에 따라 old/new API 자동 선택
     *
     * @param request 기본정보 조회 요청 (신규 포맷)
     * @return 차량 기본정보 조회 결과
     */
    @PostMapping("/getBasicInfo.do")
    @ResponseBody
    @Operation(summary = "자동차 기본사항 조회", description = "YAML 설정에 따라 차량 기본정보를 조회합니다.")
    public ResponseEntity<?> getBasicInfo(@RequestBody NewBasicRequest request) {
        log.info("========== 자동차 기본사항 조회 시작 ==========");

        // 입력값 검증 - record 배열 확인
        if (request.getRecord() == null || request.getRecord().isEmpty()) {
            log.warn("조회 대상 record가 입력되지 않았습니다.");
            return ApiResponseUtil.error("조회 대상 정보를 입력해주세요.");
        }

        NewBasicRequest.Record record = request.getRecord().get(0);
        log.info("요청 차량번호: {}", record.getVhrno());
        log.info("부과기준일: {}", record.getLevyCrtrYmd());
        log.info("조회구분코드: {}", record.getInqSeCd());
        log.info("차대번호: {}", record.getVin());

        // 입력값 검증 - 부과기준일 필수
        if (!StringUtils.hasText(record.getLevyCrtrYmd())) {
            log.warn("부과기준일이 입력되지 않았습니다.");
            return ApiResponseUtil.error("부과기준일을 입력해주세요.");
        }

        // 입력값 검증 - 차량번호 또는 차대번호 중 하나 필수
        if (!StringUtils.hasText(record.getVhrno()) && !StringUtils.hasText(record.getVin())) {
            log.warn("차량번호 또는 차대번호가 입력되지 않았습니다.");
            return ApiResponseUtil.error("차량번호 또는 차대번호 중 하나를 입력해주세요.");
        }

        // 차량 기본정보 조회 (YAML 설정에 따라 old/new 자동 선택)
        NewBasicResponse response = service.getBasicInfo(request);

        log.info("자동차 기본사항 조회 성공 - 차량번호: {}, 차대번호: {}", record.getVhrno(), record.getVin());
        log.info("========== 자동차 기본사항 조회 완료 ==========");
        return ApiResponseUtil.success(response, "자동차 기본사항 조회가 완료되었습니다.");

    }

    /**
     * 자동차 등록원부(갑) 조회 (단독)
     * YAML 설정에 따라 old/new API 자동 선택
     *
     * @param request 등록원부 조회 요청 (신규 포맷)
     * @return 차량 등록원부 조회 결과
     */
    @PostMapping("/getLedgerInfo.do")
    @ResponseBody
    @Operation(summary = "자동차 등록원부(갑) 조회", description = "YAML 설정에 따라 차량 등록원부 정보를 조회합니다.")
    public ResponseEntity<?> getLedgerInfo(@RequestBody NewLedgerRequest request) {
        log.info("========== 자동차 등록원부(갑) 조회 시작 ==========");
        log.info("요청 차량번호: {}", request.getVhrno());
        log.info("조회구분코드: {}", request.getInqSeCd());
        log.info("민원인성명: {}", request.getCvlprNm());
        log.info("민원인주민번호: {}", request.getCvlprIdecno() != null ? "********" : null);

        // 입력값 검증 - 차량번호 필수
        if (!StringUtils.hasText(request.getVhrno())) {
            log.warn("차량번호가 입력되지 않았습니다.");
            return ApiResponseUtil.error("차량번호를 입력해주세요.");
        }

        // 입력값 검증 - 소유자명 필수
        if (!StringUtils.hasText(request.getCvlprNm())) {
            log.warn("소유자명이 입력되지 않았습니다.");
            return ApiResponseUtil.error("소유자명을 입력해주세요.");
        }

        // 입력값 검증 - 주민번호 필수
        if (!StringUtils.hasText(request.getCvlprIdecno())) {
            log.warn("주민번호가 입력되지 않았습니다.");
            return ApiResponseUtil.error("주민번호를 입력해주세요.");
        }

        // 차량 등록원부 조회 (YAML 설정에 따라 old/new 자동 선택)
        NewLedgerResponse response = service.getLedgerInfo(request);

        log.info("자동차 등록원부(갑) 조회 성공 - 차량번호: {}", request.getVhrno());
        log.info("========== 자동차 등록원부(갑) 조회 완료 ==========");
        return ApiResponseUtil.success(response, "자동차 등록원부(갑) 조회가 완료되었습니다.");
    }
}
