package incheon.ags.dss.status.web;

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

import incheon.ags.dss.status.service.StatAnalysisService;
import incheon.com.cmm.context.RequestContext;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.ags.dss.status.service.AnaZoneStatService;
import lombok.RequiredArgsConstructor;

@Tag(name = "쇠퇴/낙후 현황 분석", description = "대상지 현황 통계 및 비교 분석 API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/dss/ana/zoneStat")
public class AnaZoneStatApiController {

    private final AnaZoneStatService service;

    private final StatAnalysisService statAnalysisService;

 // 1. 분석 수행
    @Operation(summary = "대상지 현황 분석 수행")
    @PostMapping("/run.do")
    public ResponseEntity<DefaultApiResponse> runAnalysis(@RequestBody Map<String, Object> params) throws Exception {
        int tareNo = Integer.parseInt(String.valueOf(params.get("tareNo")));
        // Service가 연도 목록과 범례ID를 담은 Map 반환
        Map<String, Object> result = service.runStatusAnalysis(tareNo);
        return ResponseEntity.ok(DefaultApiResponse.success(result, "분석 완료"));
    }

    // [신규] 분석 상태 확인
    @GetMapping("/status.do")
    public ResponseEntity<DefaultApiResponse> checkStatus(@RequestParam("tareNo") int tareNo) throws Exception {
        boolean isComplete = service.checkStatusCompletion(tareNo);
        // 완료되면 결과 데이터(yearList 등)도 같이 내려줄 수 있음
        Map<String, Object> result = new HashMap<>();
        result.put("status", isComplete ? "Y" : "N");

        if (isComplete) {
            // A. 분석된 연도 목록
            List<Map<String, Object>> yearList = service.selectAnalyzedYearList(tareNo);
            result.put("yearList", yearList);

            // B. [추가] 기본 범례 ID (lgdFrmNo) 생성 및 반환
            // (로그인 사용자 ID 가져오기)
            String userId = RequestContext.getCurrentUserId();
            if (userId == null) userId = "ANONYMOUS";

            int lgdFrmNo = statAnalysisService.getDefaultLegendId(userId);
            result.put("lgdFrmNo", lgdFrmNo);
        }

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

    /**
     * [신규] 기준/비교 시점용 연도 목록 조회 (ana_wghtval_sm 기준)
     */
    @Operation(summary = "가중치 연도 목록 조회", description = "기준시점/비교시점 설정을 위한 연도 목록을 조회합니다.")
    @GetMapping("/years/weight.do")
    public ResponseEntity<DefaultApiResponse> getWeightValYears() throws Exception {
        List<Map<String, Object>> list = service.selectWeightValYearList();
        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("list", list), "조회 완료"));
    }
    
    // 2. 기본 통계 조회
    @Operation(summary = "기본 통계 조회")
    @GetMapping("/basic.do")
    public ResponseEntity<DefaultApiResponse> getBasicStats(
            @RequestParam("tareNo") int tareNo, 
            @RequestParam("baye") String baye) throws Exception {
        List<Map<String, Object>> list = service.selectBasicStats(tareNo, baye);
        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("list", list), "조회 완료"));
    }

    @Operation(summary = "지표 분석 및 Gap 분석 수행", description = "지도 설정을 저장하고, 해당 조건으로 Gap 분석 결과를 반환합니다.")
    @PostMapping("/gap.do") // URL은 유지하되 로직 변경
    public ResponseEntity<DefaultApiResponse> processIndicatorAnalysis(@RequestBody Map<String, Object> params) throws Exception {
        
        // 필수 파라미터 체크: tareNo, crtrYr, cmprYr, idctId, lgdFrmNo
        // (프론트에서 넘겨줘야 함)
        
        Map<String, Object> result = service.processIndicatorAnalysis(params);
        
        return ResponseEntity.ok(DefaultApiResponse.success(result, "분석 및 저장이 완료되었습니다."));
    }
    
    /**
     * [신규] 실시간 Gap 분석 결과 단순 조회 (저장 로직 없음)
     * URL: /api/v1/dss/ana/zoneStat/gap/view.do
     */
    @Operation(summary = "Gap 분석 결과 조회 (저장X)", description = "대상지와 인근 집계구의 지표 격차를 단순 조회합니다.")
    @GetMapping("/gap/view.do")
    public ResponseEntity<DefaultApiResponse> viewGapAnalysis(
            @RequestParam("tareNo") int tareNo, 
            @RequestParam("cmprYr") String cmprYr, 
            @RequestParam("idctId") String idctId) throws Exception {

        // Service의 selectGapAnalysis 호출
        List<Map<String, Object>> list = service.selectGapAnalysis(tareNo, cmprYr, idctId);
        
        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("gapList", list), "조회 완료"));
    }
    
    @Operation(summary = "전체 지표 Gap 분석 결과 조회 (저장X)", description = "대상지와 인근 집계구의 모든 지표 격차를 단순 조회합니다.")
    @GetMapping("/gap/viewAll.do")
    public ResponseEntity<DefaultApiResponse> viewGapAnalysisAll(
            @RequestParam("tareNo") int tareNo, 
            @RequestParam("cmprYr") String cmprYr) throws Exception {

        // Service의 selectGapAnalysisAll 호출
        List<Map<String, Object>> list = service.selectGapAnalysisAll(tareNo, cmprYr);
        
        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("gapList", list), "조회 완료"));
    }
    
//    // 3. 실시간 Gap 분석 (지표 클릭 시 호출)
//    @Operation(summary = "실시간 Gap 분석")
//    @PostMapping("/gap.do")
//    public ResponseEntity<DefaultApiResponse> getGapAnalysis(@RequestBody Map<String, Object> params) throws Exception {
//        int tareNo = Integer.parseInt(String.valueOf(params.get("tareNo")));
//        String baye = String.valueOf(params.get("baye"));
//        String idctId = String.valueOf(params.get("idctId"));
//
//        List<Map<String, Object>> list = service.selectGapAnalysis(tareNo, baye, idctId);
//        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("list", list), "Gap 분석 완료"));
//    }

//    @Operation(summary = "지표 지도 계산 및 조회", description = "기준/비교 시점에 따른 지표 데이터를 계산하고 조회합니다.")
//    @PostMapping("/map/calc.do")
//    public ResponseEntity<DefaultApiResponse> calculateMapStats(@RequestBody Map<String, Object> params) throws Exception {
//        int tareNo = Integer.parseInt(String.valueOf(params.get("tareNo")));
//        String crtrYr = String.valueOf(params.get("crtrYr"));
//        String cmprYr = String.valueOf(params.get("cmprYr")); // 비교년도 파라미터 추가
//        int lgdFrmNo = Integer.parseInt(String.valueOf(params.get("lgdFrmNo"))); // 범례ID 파라미터 추가
//
//        List<Map<String, Object>> list = service.calculateAndGetMapStats(tareNo, crtrYr, cmprYr, lgdFrmNo);
//        return ResponseEntity.ok(DefaultApiResponse.success(Map.of("list", list), "지표 계산 완료"));
//    }

}