package incheon.ags.ias.linkData.web;

import incheon.ags.ias.dept.vo.DeptSearchVO;
import incheon.ags.ias.linkData.service.LinkDataService;
import incheon.ags.ias.linkData.vo.LinkDataSearchVO;
import incheon.ags.ias.linkData.vo.LinkDataVO;
import incheon.ags.ias.sys.service.SysService;
import incheon.com.security.annotation.RequireRole;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;

@Controller
@RequiredArgsConstructor
@Slf4j
@RequireRole(system = "AGS", roles = "ROLE_SUPER_ADMIN", description = "통합관리자 역할 접근 제어")
public class LinkDataController {
    private final LinkDataService linkDataService;
    private final SysService sysService;

    @GetMapping("/ags/ias/linkData/linkDataList.do")
    public String linkDataList(
            @RequestParam(defaultValue = "1") int page,
            @ModelAttribute LinkDataSearchVO searchVO,
            ModelMap model) throws Exception {


        // 1. 총 개수 조회
        int totalCount = linkDataService.selectLinkDataCnt(searchVO);

        // 2. 페이징 설정
        searchVO.setPageIndex(page);
        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setCurrentPageNo(page);
        paginationInfo.setRecordCountPerPage(searchVO.getRecordCountPerPage());
        paginationInfo.setPageSize(searchVO.getPageSize());
        paginationInfo.setTotalRecordCount(totalCount);

        // 3. 페이징 파라미터 설정
        searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
        searchVO.setLastIndex(paginationInfo.getLastRecordIndex());
        searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        List<Map<String,Object>> linkDataList = linkDataService.selectLinkDataList(searchVO);

        model.addAttribute("linkDataList", linkDataList);
        model.addAttribute("totalCount", totalCount);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVO", searchVO);

        return "ags/ias/linkData/linkDataList";
    }

    @GetMapping("/ags/ias/linkData/linkDataDetail.do")
    public String linkDataDetail(
            @RequestParam String linkId,
            ModelMap model) throws Exception {

        LinkDataVO linkDataVO = new LinkDataVO();
        linkDataVO.setLinkId(linkId);
        LinkDataVO linkData = linkDataService.selectLinkDataDetail(linkDataVO);
        model.addAttribute("linkData", linkData);

        return "ags/ias/linkData/linkDataDetail";
    }

    @GetMapping("/ags/ias/linkData/linkDataRegist.do")
    public String linkDataRegist(
            ModelMap model) throws Exception {

        List<Map<String,Object>> sysList = sysService.selectAllSysList();
        model.addAttribute("sysList", sysList);

        return "ags/ias/linkData/linkDataRegist";
    }

    @GetMapping("/ags/ias/linkData/linkDataModify.do")
    public String linkDataModify(
            @RequestParam String linkId,
            ModelMap model) throws Exception {

        LinkDataVO linkDataVO = new LinkDataVO();
        linkDataVO.setLinkId(linkId);
        LinkDataVO linkData = linkDataService.selectLinkDataDetail(linkDataVO);
        model.addAttribute("linkData", linkData);

        List<Map<String,Object>> sysList = sysService.selectAllSysList();
        model.addAttribute("sysList", sysList);

        return "ags/ias/linkData/linkDataModify";
    }

    @GetMapping("/ags/ias/linkData/linkDataSettingPopup.do")
    public String linkDataSettingPopup(
            @RequestParam String linkId,
            ModelMap model) throws Exception {

        LinkDataVO linkDataVO = new LinkDataVO();
        linkDataVO.setLinkId(linkId);
        List<Map<String,Object>> metData = linkDataService.selectMetDataWithLinkId(linkDataVO);
        List<Map<String,Object>> metDataParam = linkDataService.selectMetDataDmndParam(linkDataVO);
        List<Map<String,Object>> metDataHeader = linkDataService.selectMetDataDmndHeader(linkDataVO);

        model.addAttribute("metData", metData);
        model.addAttribute("metDataParam", metDataParam);
        model.addAttribute("metDataHeader", metDataHeader);
        model.addAttribute("linkId", linkId);
        return "ags/ias/linkData/linkDataSettingPopup";
    }

    @GetMapping("/ags/ias/linkData/collectionStatusPopup.do")
    public String collectionStatusPopup(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam String linkId,
            @ModelAttribute LinkDataSearchVO searchVO,
            ModelMap model) throws Exception {

        LocalDate searchLocalDate = LocalDate.now().minusDays(7);

        searchVO.setLinkId(linkId);
        searchVO.setSearchDate(searchLocalDate);

        int totalCount = linkDataService.selectClctHstryTotCnt(searchVO);

        // 2. 페이징 설정
        searchVO.setPageIndex(page);
        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setCurrentPageNo(page);
        paginationInfo.setRecordCountPerPage(searchVO.getRecordCountPerPage());
        paginationInfo.setPageSize(searchVO.getPageSize());
        paginationInfo.setTotalRecordCount(totalCount);

        // 3. 페이징 파라미터 설정
        searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
        searchVO.setLastIndex(paginationInfo.getLastRecordIndex());
        searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        // 4. 페이징이 적용된 상태로 데이터 조회
        List<Map<String,Object>> clctDalyList = linkDataService.selectClctDalySmryList(searchVO);
        List<Map<String,Object>> clctHstryList = linkDataService.selectClctIntgHstryList(searchVO);
        int TotPrcsCnt = linkDataService.selectDalySmryTotPrcsCnt(searchVO);
        int TotScsCnt = linkDataService.selectDalySmryTotScsCnt(searchVO);
        int TotFailCnt = linkDataService.selectDalySmryTotFailCnt(searchVO);
        int AvgScsRpblty = linkDataService.selectDalyScsRpbltyAvg(searchVO);
        long AvgPrcsHr = linkDataService.selectDalyPrcsHrAvg(searchVO);

        log.info("=== 수집현황 팝업 통계 ===");
        log.info("TotPrcsCnt: {}, TotScsCnt: {}, TotFailCnt: {}", TotPrcsCnt, TotScsCnt, TotFailCnt);
        log.info("AvgScsRpblty: {}%, AvgPrcsHr: {}ms", AvgScsRpblty, AvgPrcsHr);

        model.addAttribute("TotPrcsCnt", TotPrcsCnt);
        model.addAttribute("TotScsCnt", TotScsCnt);
        model.addAttribute("TotFailCnt", TotFailCnt);
        model.addAttribute("AvgScsRpblty", AvgScsRpblty);
        model.addAttribute("AvgPrcsHr", AvgPrcsHr);
        model.addAttribute("clctDalyList", clctDalyList);
        model.addAttribute("clctHstryList", clctHstryList);
        model.addAttribute("linkId", linkId);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("totalCount", totalCount);

        return "ags/ias/linkData/collectionStatusPopup";
    }

    @GetMapping("/ags/ias/linkData/dataRegistrationPopup.do")
    public String dataRegistrationPopup(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam String linkId,
            @ModelAttribute LinkDataSearchVO searchVO,
            ModelMap model) throws Exception {

        LinkDataVO linkDataVO = new LinkDataVO();
        linkDataVO.setLinkId(linkId);

        int totalCount = linkDataService.selectLinkDataHoprHstryTotCnt(searchVO);

        // 2. 페이징 설정
        searchVO.setPageIndex(page);
        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setCurrentPageNo(page);
        paginationInfo.setRecordCountPerPage(searchVO.getRecordCountPerPage());
        paginationInfo.setPageSize(searchVO.getPageSize());
        paginationInfo.setTotalRecordCount(totalCount);

        // 3. 페이징 파라미터 설정
        searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
        searchVO.setLastIndex(paginationInfo.getLastRecordIndex());
        searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        LinkDataVO linkData = linkDataService.selectLinkDataDetail(linkDataVO);
        List<Map<String,Object>> hoprHstryList = linkDataService.selectLinkDataHoprHstryList(searchVO);

        model.addAttribute("hoprHstryList", hoprHstryList);
        model.addAttribute("linkData", linkData);
        model.addAttribute("linkId", linkId);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("totalCount", totalCount);

        return "ags/ias/linkData/dataRegistrationPopup";
    }

}
