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

import egovframework.constant.TilesConstants;
import egovframework.util.ApiResponseUtil;
import go.kr.project.api.model.VehicleApiResponseVO;
import go.kr.project.api.model.request.BasicRequest;
import go.kr.project.api.model.request.LedgerRequest;
import go.kr.project.api.model.response.BasicResponse;
import go.kr.project.api.model.response.LedgerResponse;
import go.kr.project.api.service.VehicleInfoService;
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 VehicleInfoService vehicleInfoService;

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

    /**
     * 자동차 통합 조회 (기본정보 + 등록원부)
     *
     * @param request 기본정보 조회 요청
     * @return 차량 통합 정보 조회 결과
     */
    @PostMapping("/getIntegratedInfo.do")
    @ResponseBody
    @Operation(summary = "자동차 통합 조회", description = "차량 기본정보와 등록원부 정보를 함께 조회합니다.")
    public ResponseEntity<?> getIntegratedInfo(@RequestBody BasicRequest request) {
        log.info("========== 자동차 통합 조회 시작 ==========");
        log.info("요청 차량번호: {}", request.getVhrno());
        log.info("부과기준일: {}", request.getLevyStdde());
        log.info("조회구분코드: {}", request.getInqireSeCode());
        log.info("차대번호: {}", request.getVin());

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

        // 차량 정보 조회
        VehicleApiResponseVO response = vehicleInfoService.getVehicleInfo(request);
        if(!response.isSuccess()) {
            log.warn("자동차 통합 조회 실패 - 차량번호: {}, 메시지: {}", request.getVhrno(), response.getMessage());
            log.warn("========== 자동차 통합 조회 실패 ==========");
            return ApiResponseUtil.error(response.getMessage());
        }

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

    /**
     * 자동차 기본사항 조회 (단독)
     *
     * @param request 기본정보 조회 요청
     * @return 차량 기본정보 조회 결과
     */
    @PostMapping("/getBasicInfo.do")
    @ResponseBody
    @Operation(summary = "자동차 기본사항 조회", description = "차량 기본정보만 조회합니다.")
    public ResponseEntity<?> getBasicInfo(@RequestBody BasicRequest request) {
        log.info("========== 자동차 기본사항 조회 시작 ==========");
        log.info("요청 차량번호: {}", request.getVhrno());
        log.info("부과기준일: {}", request.getLevyStdde());
        log.info("조회구분코드: {}", request.getInqireSeCode());
        log.info("차대번호: {}", request.getVin());

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

        // 차량 기본정보 조회
        BasicResponse response = vehicleInfoService.getBasicInfo(request);

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

    }

    /**
     * 자동차 등록원부(갑) 조회 (단독)
     *
     * @param request 등록원부 조회 요청
     * @return 차량 등록원부 조회 결과
     */
    @PostMapping("/getLedgerInfo.do")
    @ResponseBody
    @Operation(summary = "자동차 등록원부(갑) 조회", description = "차량 등록원부 정보만 조회합니다.")
    public ResponseEntity<?> getLedgerInfo(@RequestBody LedgerRequest request) {
        log.info("========== 자동차 등록원부(갑) 조회 시작 ==========");
        log.info("요청 차량번호: {}", request.getVhrno());
        log.info("조회구분코드: {}", request.getInqireSeCode());
        log.info("민원인성명: {}", request.getCpttrNm());

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

        // 차량 등록원부 조회
        LedgerResponse response = vehicleInfoService.getLedgerInfo(request);

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