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

import egovframework.constant.TilesConstants;
import egovframework.util.ApiResponseUtil;
import go.kr.project.api.model.CarBassMatterInqireVO;
import go.kr.project.api.model.CarLedgerFrmbkDtlVO;
import go.kr.project.api.model.CarLedgerFrmbkVO;
import go.kr.project.carInspectionPenalty.history.model.VehicleApiHistorySearchVO;
import go.kr.project.carInspectionPenalty.history.service.VehicleApiHistoryService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
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.web.bind.annotation.*;

import java.util.List;

/**
 * packageName    : go.kr.project.carInspectionPenalty.history.Controller
 * fileName       : VehicleApiHistoryController
 * author         : 시스템 관리자
 * date           : 2025-11-06
 * description    : 차량 API 조회 이력 컨트롤러
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2025-11-06        시스템 관리자             최초 생성
 */
@Controller
@RequestMapping("/carInspectionPenalty/history")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "차량 API 조회 이력", description = "차량 기본정보 및 등록원부 조회 이력 API")
public class VehicleApiHistoryController {

    private final VehicleApiHistoryService service;

    /**
     * 차량 API 조회 이력 목록 화면
     *
     * @param model 모델 객체
     * @return 차량 API 조회 이력 목록 화면
     */
    @GetMapping("/list.do")
    @Operation(summary = "차량 API 조회 이력 목록 화면", description = "차량 API 조회 이력 목록을 조회하는 화면을 제공합니다.")
    public String list(Model model) {
        log.debug("차량 API 조회 이력 목록 화면 요청");
        return "carInspectionPenalty/history/list" + TilesConstants.BASE;
    }

    // ==================== 자동차 기본정보 조회 이력 ====================

    /**
     * 자동차 기본정보 조회 이력 목록을 조회합니다.
     *
     * @param searchVO 검색 조건을 담은 VO 객체
     * @return 자동차 기본정보 조회 이력 목록
     */
    @PostMapping("/carBassMatterInqire/list.ajax")
    @Operation(summary = "자동차 기본정보 조회 이력 목록 조회", description = "자동차 기본정보 조회 이력 목록을 조회합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "조회 성공"),
        @ApiResponse(responseCode = "400", description = "조회 실패")
    })
    public ResponseEntity<?> selectCarBassMatterInqireList(@ModelAttribute VehicleApiHistorySearchVO searchVO) {
        log.debug("자동차 기본정보 조회 이력 목록 조회 요청 - 검색 조건: {}", searchVO);

        // 총 개수 조회
        int totalCount = service.selectCarBassMatterInqireListTotalCount(searchVO);
        searchVO.setTotalCount(totalCount);

        // 페이징 처리
        searchVO.setPagingYn("Y");

        // 목록 조회
        List<CarBassMatterInqireVO> list = service.selectCarBassMatterInqireList(searchVO);
        return ApiResponseUtil.successWithGrid(list, searchVO);
    }

    /**
     * 자동차 기본정보 조회 이력 상세를 조회합니다.
     *
     * @param carBassMatterInqireId 자동차 기본 사항 조회 ID
     * @return 자동차 기본정보 조회 이력 상세
     */
    @GetMapping("/carBassMatterInqire/selectOne.ajax")
    @Operation(summary = "자동차 기본정보 조회 이력 상세 조회", description = "자동차 기본정보 조회 이력 상세를 조회합니다.")
    public ResponseEntity<?> selectCarBassMatterInqireOne(
            @Parameter(description = "자동차 기본 사항 조회 ID") @RequestParam String carBassMatterInqireId) {
        log.debug("자동차 기본정보 조회 이력 상세 조회 요청 - ID: {}", carBassMatterInqireId);

        CarBassMatterInqireVO result = service.selectCarBassMatterInqireOne(carBassMatterInqireId);
        if (result != null) {
            return ApiResponseUtil.success(result, "조회가 완료되었습니다.");
        } else {
            return ApiResponseUtil.error("해당 정보를 찾을 수 없습니다.");
        }
    }

    // ==================== 자동차 등록원부(갑) 조회 이력 ====================

    /**
     * 자동차 등록원부(갑) 조회 이력 목록을 조회합니다.
     *
     * @param searchVO 검색 조건을 담은 VO 객체
     * @return 자동차 등록원부(갑) 조회 이력 목록
     */
    @PostMapping("/carLedgerFrmbk/list.ajax")
    @Operation(summary = "자동차 등록원부(갑) 조회 이력 목록 조회", description = "자동차 등록원부(갑) 조회 이력 목록을 조회합니다.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "조회 성공"),
        @ApiResponse(responseCode = "400", description = "조회 실패")
    })
    public ResponseEntity<?> selectCarLedgerFrmbkList(@ModelAttribute VehicleApiHistorySearchVO searchVO) {
        log.debug("자동차 등록원부(갑) 조회 이력 목록 조회 요청 - 검색 조건: {}", searchVO);

        // 총 개수 조회
        int totalCount = service.selectCarLedgerFrmbkListTotalCount(searchVO);
        searchVO.setTotalCount(totalCount);

        // 페이징 처리
        searchVO.setPagingYn("Y");

        // 목록 조회
        List<CarLedgerFrmbkVO> list = service.selectCarLedgerFrmbkList(searchVO);
        return ApiResponseUtil.successWithGrid(list, searchVO);
    }

    /**
     * 자동차 등록원부(갑) 조회 이력 상세를 조회합니다.
     *
     * @param carLedgerFrmbkId 자동차 등록 원부 갑 ID
     * @return 자동차 등록원부(갑) 조회 이력 상세
     */
    @GetMapping("/carLedgerFrmbk/selectOne.ajax")
    @Operation(summary = "자동차 등록원부(갑) 조회 이력 상세 조회", description = "자동차 등록원부(갑) 조회 이력 상세를 조회합니다.")
    public ResponseEntity<?> selectCarLedgerFrmbkOne(
            @Parameter(description = "자동차 등록 원부 갑 ID") @RequestParam String carLedgerFrmbkId) {
        log.debug("자동차 등록원부(갑) 조회 이력 상세 조회 요청 - ID: {}", carLedgerFrmbkId);

        CarLedgerFrmbkVO result = service.selectCarLedgerFrmbkOne(carLedgerFrmbkId);
        if (result != null) {
            return ApiResponseUtil.success(result, "조회가 완료되었습니다.");
        } else {
            return ApiResponseUtil.error("해당 정보를 찾을 수 없습니다.");
        }
    }

    // ==================== 자동차 등록원부(갑) 상세 조회 이력 ====================

    /**
     * 자동차 등록원부(갑) 상세 조회 이력 목록을 조회합니다.
     *
     * @param carLedgerFrmbkId 자동차 등록 원부 갑 ID
     * @return 자동차 등록원부(갑) 상세 조회 이력 목록
     */
    @GetMapping("/carLedgerFrmbkDtl/list.ajax")
    @Operation(summary = "자동차 등록원부(갑) 상세 조회 이력 목록 조회", description = "자동차 등록원부(갑) 상세 조회 이력 목록을 조회합니다.")
    public ResponseEntity<?> selectCarLedgerFrmbkDtlList(
            @Parameter(description = "자동차 등록 원부 갑 ID") @RequestParam String carLedgerFrmbkId) {
        log.debug("자동차 등록원부(갑) 상세 조회 이력 목록 조회 요청 - 원부 갑 ID: {}", carLedgerFrmbkId);

        List<CarLedgerFrmbkDtlVO> list = service.selectCarLedgerFrmbkDtlList(carLedgerFrmbkId);
        return ApiResponseUtil.success(list, "조회가 완료되었습니다.");
    }

    /**
     * 자동차 등록원부(갑) 상세 조회 이력 상세를 조회합니다.
     *
     * @param carLedgerFrmbkDtlId 자동차 등록 원부 갑 상세 ID
     * @return 자동차 등록원부(갑) 상세 조회 이력 상세
     */
    @GetMapping("/carLedgerFrmbkDtl/selectOne.ajax")
    @Operation(summary = "자동차 등록원부(갑) 상세 조회 이력 상세 조회", description = "자동차 등록원부(갑) 상세 조회 이력 상세를 조회합니다.")
    public ResponseEntity<?> selectCarLedgerFrmbkDtlOne(
            @Parameter(description = "자동차 등록 원부 갑 상세 ID") @RequestParam String carLedgerFrmbkDtlId) {
        log.debug("자동차 등록원부(갑) 상세 조회 이력 상세 조회 요청 - ID: {}", carLedgerFrmbkDtlId);

        CarLedgerFrmbkDtlVO result = service.selectCarLedgerFrmbkDtlOne(carLedgerFrmbkDtlId);
        if (result != null) {
            return ApiResponseUtil.success(result, "조회가 완료되었습니다.");
        } else {
            return ApiResponseUtil.error("해당 정보를 찾을 수 없습니다.");
        }
    }

    /**
     * 자동차 기본정보 조회 팝업
     *
     * @param carBassMatterInqireId 자동차 기본 사항 조회 ID
     * @param model 모델 객체
     * @return 자동차 기본정보 조회 팝업 화면
     */
    @GetMapping("/carBassMatterInqire/popup.do")
    @Operation(summary = "자동차 기본정보 조회 팝업", description = "자동차 기본정보를 조회하는 팝업 화면을 제공합니다.")
    public String basicInfoPopup(@RequestParam String carBassMatterInqireId, Model model) {
        log.debug("자동차 기본정보 조회 팝업 요청 - ID: {}", carBassMatterInqireId);
        CarBassMatterInqireVO result = service.selectCarBassMatterInqireOne(carBassMatterInqireId);
        model.addAttribute("data", result);
        return "carInspectionPenalty/history/basicInfoPopup" + TilesConstants.POPUP;
    }

    /**
     * 자동차 등록원부(갑) 조회 팝업
     *
     * @param carLedgerFrmbkId 자동차 등록 원부 갑 ID
     * @param model 모델 객체
     * @return 자동차 등록원부(갑) 조회 팝업 화면
     */
    @GetMapping("/carLedgerFrmbk/popup.do")
    @Operation(summary = "자동차 등록원부(갑) 조회 팝업", description = "자동차 등록원부(갑) 정보를 조회하는 팝업 화면을 제공합니다.")
    public String ledgerInfoPopup(@RequestParam String carLedgerFrmbkId, Model model) {
        log.debug("자동차 등록원부(갑) 조회 팝업 요청 - ID: {}", carLedgerFrmbkId);
        CarLedgerFrmbkVO result = service.selectCarLedgerFrmbkOne(carLedgerFrmbkId);
        if (result != null) {
            List<CarLedgerFrmbkDtlVO> details = service.selectCarLedgerFrmbkDtlList(carLedgerFrmbkId);
            result.setRecord(details);
        }
        model.addAttribute("data", result);
        return "carInspectionPenalty/history/ledgerInfoPopup" + TilesConstants.POPUP;
    }
}
