package incheon.ags.dss.decline.web;

import java.util.HashMap;
import java.util.Map;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.ags.dss.decline.service.AnaZoneDgnsDtlService;
import incheon.ags.dss.decline.vo.AnaZoneDgnsDtlVO;
import incheon.ags.dss.status.web.AnaIdctApiController;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Tag(name = "쇠퇴/낙후 진단", description = "쇠퇴/낙후 진단 분석 실행 및 결과 이력 조회 API")
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping("/api/v1/dss/ana/zoneDgnsDtl")
public class AnaZoneDgnsDtlApiController {

    private final AnaZoneDgnsDtlService service;

    @Operation(summary = "진단 실행", description = "진단 기준을 설정하고 분석 프로시저를 호출하여 쇠퇴 여부를 진단합니다.")
    @PostMapping("/run.do")
    public ResponseEntity<DefaultApiResponse> runDiagnosis(@RequestBody AnaZoneDgnsDtlVO vo) throws Exception {
        String dgnsNo = service.runDiagnosisAnalysis(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("dgnsNo", dgnsNo), "진단 완료"));
    }

    @Operation(summary = "진단 결과 조회", description = "특정 진단 번호와 예측 연도에 따른 상세 진단 결과(지역별 O/X 및 수치)를 조회합니다.")
    @GetMapping("/result.do")
    public ResponseEntity<DefaultApiResponse> getResult(
            @RequestParam("dgnsNo") int dgnsNo, 
            @RequestParam("targetYear") int targetYear) throws Exception {
        
        List<Map<String, Object>> list = service.selectDiagnosisResult(dgnsNo, targetYear);
        
        log.warn("API: getAnaIdctList (list: {})", list);
        
        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("list", list), "조회 성공"));
    }

    @Operation(summary = "진단 이력 목록 조회", description = "과거에 수행한 진단 이력 목록을 페이징하여 조회합니다.")
    @GetMapping("/list.do")
    public ResponseEntity<DefaultApiResponse> getList(@ModelAttribute AnaZoneDgnsDtlVO vo) throws Exception {
        List<AnaZoneDgnsDtlVO> list = service.selectAnaZoneDgnsDtlList(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("list", list), "이력 목록 조회"));
    }

    @Operation(summary = "진단 이력 상세 조회", description = "특정 진단 이력의 상세 설정 정보를 조회합니다.")
    @GetMapping("/detail.do")
    public ResponseEntity<DefaultApiResponse> getDetail(@RequestParam("dgnsNo") String dgnsNo) throws Exception {
        AnaZoneDgnsDtlVO vo = new AnaZoneDgnsDtlVO();
        vo.setDgnsNo(dgnsNo);
        AnaZoneDgnsDtlVO result = service.selectAnaZoneDgnsDtlDetail(vo);
        return ResponseEntity.ok(DefaultApiResponse.success(result, "이력 상세 조회"));
    }
    
    @Operation(summary = "진단 옵션 조회", description = "기준시점(DB) 및 예측시점(금년~10년후) 목록을 조회합니다.")
    @GetMapping("/options.do")
    public ResponseEntity<DefaultApiResponse> getOptions() throws Exception {
        Map<String, Object> result = service.selectDiagnosisOptions();
        return ResponseEntity.ok(DefaultApiResponse.success(result, "옵션 조회 성공"));
    }

    @Operation(summary = "진단 분석 상태 확인", description = "Polling용: 진단 결과 데이터 생성 여부를 반환합니다.")
    @GetMapping("/status.do")
//    public ResponseEntity<DefaultApiResponse> checkStatus(@RequestParam("dgnsNo") String dgnsNo) throws Exception {
//        // Service에 새로 만든 메서드 호출 (구현 필요)
//        // AnaZoneDgnsDtlServiceImpl에 checkDiagnosisCompletion 메서드를 인터페이스에 추가해야 함
//        boolean isComplete = service.checkDiagnosisCompletion(dgnsNo);
//
//        Map<String, Object> result = new HashMap<>();
//        result.put("status", isComplete ? "Y" : "N");
//
//        return ResponseEntity.ok(DefaultApiResponse.success(result));
//    }
    public ResponseEntity<DefaultApiResponse> checkStatus(@RequestParam("dgnsNo") String dgnsNo) throws Exception {
        
        // [수정] boolean(true/false) 대신 String("Y"/"N"/"FAIL")을 받아옵니다.
        // Service 내부에서 RUNNING인지 FAIL인지 판단해서 줍니다.
        String status = service.checkDiagnosisStatus(dgnsNo); 

        Map<String, Object> result = new HashMap<>();
        
        // 받아온 상태값 그대로 프론트엔드에 전달 (Y:완료, N:진행중, FAIL:오류)
        result.put("status", status);
        
        // (선택사항) FAIL일 경우 메시지를 같이 보내고 싶다면 Service 리턴 타입을 Map으로 하거나,
        // 여기서는 심플하게 status만 내리고 프론트에서 기본 에러 메시지를 띄우게 해도 됩니다.

        return ResponseEntity.ok(DefaultApiResponse.success(result));
    }
}