package incheon.ags.dss.status.web;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.cmm.context.RequestContext;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.dao.DuplicateKeyException; // 중복 키 예외 처리용

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;

import incheon.ags.dss.status.service.AnaIdctService;
import incheon.ags.dss.status.vo.AnaIdctMstVO;
import incheon.ags.dss.status.web.dto.AnaIdctResponseDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 사용자 정의 지표(AnaIdct) 관리 API
 */
@Tag(name = "사용자 정의 지표", description = "사용자 정의 지표 목록, 상세, 등록, 수정, 삭제 API")
@RestController 
@RequiredArgsConstructor
@Slf4j
@RequestMapping("/api/v1/dss/ana/idct")
public class AnaIdctApiController {

    private final AnaIdctService anaIdctService;

    @Operation(summary = "지표 목록 조회", description = "검색 조건에 따른 지표 목록을 조회합니다. (searchScope: MINE=내것만, ALL=전체)")
    @GetMapping("/list.do")
    public ResponseEntity<DefaultApiResponse> getAnaIdctList(
            @Parameter(description = "검색 VO") @ModelAttribute AnaIdctMstVO searchVO) throws Exception {
        
        // 1. PaginationInfo 생성
        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setCurrentPageNo(searchVO.getPageIndex());
        paginationInfo.setRecordCountPerPage(searchVO.getRecordCountPerPage());
        paginationInfo.setPageSize(searchVO.getPageSize());

        // 2. SearchVO 페이징 값 세팅
        searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
        
        // 3. 서비스 호출
        List<AnaIdctMstVO> list = anaIdctService.selectAnaIdctList(searchVO);
        int totalCount = anaIdctService.selectAnaIdctListCnt(searchVO);
        
        paginationInfo.setTotalRecordCount(totalCount);
        
        // 4. VO List -> DTO List 변환
        List<AnaIdctResponseDTO> dtoList = AnaIdctResponseDTO.from(list);
        
        Map<String, Object> result = new HashMap<>();
        result.put("list", dtoList);
        result.put("paging", paginationInfo);
        
        return ResponseEntity.ok(DefaultApiResponse.success(result, "조회되었습니다."));
    }

    @Operation(summary = "지표 상세 조회", description = "지표 ID로 상세 정보(마스터+상세항목)를 조회합니다.")
    @GetMapping("/detail.do")
    public ResponseEntity<DefaultApiResponse> getAnaIdctDetail(
            @Parameter(description = "지표 ID", required = true) @RequestParam("idctId") String idctId) throws Exception {
        
        AnaIdctMstVO vo = new AnaIdctMstVO();
        vo.setIdctId(idctId);
        
        AnaIdctMstVO resultSet = anaIdctService.selectAnaIdctDetail(vo);
        
        return ResponseEntity.ok(DefaultApiResponse.success(AnaIdctResponseDTO.from(resultSet), "조회되었습니다."));
    }
    
    // 중복 체크 전용 GET API 추가
    @Operation(summary = "지표 ID 중복 체크", description = "삭제된 ID를 포함하여 중복 여부를 확인합니다.")
    @GetMapping("/exists.do")
    public ResponseEntity<DefaultApiResponse> checkIdExists(@RequestParam("idctId") String idctId) throws Exception {
        // Service에서 del_yn 조건 없이 count를 조회하는 메서드 호출
        int count = anaIdctService.selectAnaIdctExstCnt(idctId); 
        return ResponseEntity.ok(DefaultApiResponse.success(count, "조회되었습니다."));
    }

    @Operation(summary = "지표 저장(등록/수정)", description = "지표 마스터 및 상세 항목을 저장하거나 수정합니다.")
    @PostMapping("/save.do")
    public ResponseEntity<DefaultApiResponse> saveAnaIdct(
            @RequestBody AnaIdctMstVO vo) throws Exception {
//        anaIdctService.saveAnaIdct(vo);
//        
//        return ResponseEntity.ok(DefaultApiResponse.success(vo.getIdctId(), "저장되었습니다."));
    	try {
            anaIdctService.saveAnaIdct(vo);
            return ResponseEntity.ok(DefaultApiResponse.success(vo.getIdctId(), "저장되었습니다."));
        } catch (DuplicateKeyException e) {
            // HttpStatus.CONFLICT.value()는 409입니다.
            return ResponseEntity.status(HttpStatus.CONFLICT)
                                 .body(DefaultApiResponse.error(HttpStatus.CONFLICT.value(), "이미 존재하는 지표 ID입니다.", "DuplicateKeyError"));
        } catch (Exception e) {
        	log.error("지표 저장 중 시스템 오류", e);
            return ResponseEntity.internalServerError()
                                 .body(DefaultApiResponse.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), "저장 중 오류가 발생했습니다.", "Internal Error"));
        }
    }

    @Operation(summary = "지표 삭제", description = "지표를 삭제(Soft Delete) 처리합니다.")
    @PostMapping("/delete.do")
    public ResponseEntity<DefaultApiResponse> deleteAnaIdct(
            @Parameter(description = "지표 ID", required = true) @RequestParam("idctId") String idctId) throws Exception {
        AnaIdctMstVO vo = new AnaIdctMstVO();
        vo.setIdctId(idctId);
        vo.setLOGIN_USER_ID(RequestContext.getCurrentUserId()); // 본인 것만 삭제 가능하도록
        
        anaIdctService.deleteAnaIdct(vo);
        
        return ResponseEntity.ok(DefaultApiResponse.success(null, "삭제되었습니다."));
    }
}