package incheon.ags.ias.spceUtlz.web;

import incheon.ags.ias.spceUtlz.service.SpceUtlzService;
import incheon.ags.ias.spceUtlz.vo.GisIndicatorVO;
import incheon.ags.ias.spceUtlz.vo.SpceUtlzSearchVO;
import incheon.ags.ias.spceUtlz.vo.SpceUtlzVO;
import incheon.com.cmm.context.RequestContext;
import incheon.com.security.annotation.RequireRole;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

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

/**
 * 공간정보 활용 통계 Controller
 */
@Controller
@RequiredArgsConstructor
@Slf4j
@RequireRole(system = "AGS", roles = "ROLE_SUPER_ADMIN", description = "통합관리자 역할 접근 제어")
public class SpceUtlzController {
    private final SpceUtlzService spceUtlzService;

    /**
     * 공간정보 활용 통계 - 주간 사용자 탑10
     */
    @GetMapping("/ags/ias/spceUtlz/spceUtlzList.do")
    public String spceUtlzList(SpceUtlzSearchVO searchVO, ModelMap model) throws Exception {

        // 화면 표시용 날짜 (YYYY-MM-DD 형식)
        String displayStartDate;
        String displayEndDate;

        // 기본값 설정 (최근 7일)
        if (searchVO.getStartDate() == null || searchVO.getStartDate().isEmpty()) {
            java.time.LocalDate today = java.time.LocalDate.now();
            java.time.LocalDate startDate = today.minusDays(7);
            searchVO.setStartDate(startDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")));
            searchVO.setEndDate(today.minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd")));
            displayStartDate = startDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            displayEndDate = today.minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        } else {
            // 화면 표시용 (하이픈 포함 원본 유지)
            displayStartDate = searchVO.getStartDate().contains("-") ? searchVO.getStartDate() : formatDateWithHyphen(searchVO.getStartDate());
            displayEndDate = searchVO.getEndDate().contains("-") ? searchVO.getEndDate() : formatDateWithHyphen(searchVO.getEndDate());
            // 하이픈 제거 (YYYY-MM-DD -> YYYYMMDD)
            searchVO.setStartDate(searchVO.getStartDate().replace("-", ""));
            searchVO.setEndDate(searchVO.getEndDate().replace("-", ""));
        }

        // 주간 사용자 공간정보 활용 탑10 조회
        List<SpceUtlzVO> top10Users = spceUtlzService.selectWeeklyTop10Users(searchVO);

        // 지표별 사용 건수 통계 조회
        List<SpceUtlzVO> indicatorStats = spceUtlzService.selectIndicatorStats(searchVO);

        model.addAttribute("top10Users", top10Users);
        model.addAttribute("indicatorStats", indicatorStats);
        model.addAttribute("searchVO", searchVO);
        model.addAttribute("displayStartDate", displayStartDate);
        model.addAttribute("displayEndDate", displayEndDate);

        return "/ags/ias/spceUtlz/spceUtlzList";
    }

    /**
     * YYYYMMDD -> YYYY-MM-DD 변환
     */
    private String formatDateWithHyphen(String date) {
        if (date == null || date.length() != 8) return date;
        return date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6, 8);
    }

    /**
     * GIS 지표 공통코드 조회 API
     */
    @GetMapping("/ags/ias/spceUtlz/api/indicators")
    @ResponseBody
    public ResponseEntity<List<GisIndicatorVO>> getGisIndicators() throws Exception {
        List<GisIndicatorVO> indicators = spceUtlzService.selectGisIndicators();
        return ResponseEntity.ok(indicators);
    }

    /**
     * GIS 지표 가중치 수정 API
     */
    @PutMapping("/ags/ias/spceUtlz/api/indicators/weights")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> updateGisIndicatorWeights(
            @RequestBody List<GisIndicatorVO> indicators) throws Exception {

        String userId = RequestContext.getCurrentUserId();

        spceUtlzService.updateGisIndicatorWeights(indicators, userId);

        Map<String, Object> result = new HashMap<>();
        result.put("success", true);
        result.put("message", "가중치가 저장되었습니다.");

        return ResponseEntity.ok(result);
    }

}
