package incheon.ags.pss.commission.web;

import incheon.ags.pss.commission.service.CommissionService;
import incheon.ags.pss.commission.vo.ScAgndMstVO;
import incheon.ags.pss.commission.vo.ScCmtMstVO;
import incheon.com.cmm.api.DefaultApiResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

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

@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping("/api/pss/commission")
public class CommissionApiController {

    private final CommissionService commissionService;

    /**
     * [갱신] 전체 위원회 및 안건 데이터 갱신
     */
    @PostMapping("/renew.do")
    public ResponseEntity<DefaultApiResponse> renewCommissionData() {
        try {
            commissionService.renewCommissionData();
            return ResponseEntity.ok(DefaultApiResponse.success(null, "전체 데이터 갱신을 시작했습니다."));
        } catch (Exception e) {
            log.error("데이터 갱신 실패", e);
            return ResponseEntity.ok(DefaultApiResponse.error(500, "데이터 갱신 중 오류가 발생했습니다.","갱신 실패"));
        }
    }

    /**
     * [조회] 위원회 목록 (페이징)
     */
    @GetMapping("/cmt/list.do")
    public ResponseEntity<DefaultApiResponse> selectCommitteeList(
            @RequestParam(defaultValue = "1") int pageIndex,
            @RequestParam(defaultValue = "5") int recordCountPerPage,
            @RequestParam(required = false) String searchKeyword,
            @RequestParam(required = false) String cmtCd) { // cmtCd 파라미터 추가
        try {
            ScCmtMstVO vo = new ScCmtMstVO();
            vo.setPageIndex(pageIndex);
            vo.setRecordCountPerPage(recordCountPerPage);
            vo.setPageSize(5); // 페이지 리스트 갯수 (예: 1 2 3 4 5)

            if (searchKeyword != null) vo.setSearchKeyword(searchKeyword);
            if (cmtCd != null) vo.setCmtCd(cmtCd); // ScCmtMstVO에 cmtCd 설정

            PaginationInfo paginationInfo = new PaginationInfo();
            paginationInfo.setCurrentPageNo(pageIndex);
            paginationInfo.setRecordCountPerPage(recordCountPerPage);
            paginationInfo.setPageSize(vo.getPageSize());

            vo.setFirstIndex(paginationInfo.getFirstRecordIndex());
            vo.setLastIndex(paginationInfo.getLastRecordIndex());

            // 1. 목록 조회
            List<ScCmtMstVO> list = commissionService.selectCommitteeList(vo);

            // 2. 총 갯수 조회
            int totalCount = commissionService.selectCommitteeListCnt(vo);

            paginationInfo.setTotalRecordCount(totalCount);

            Map<String, Object> result = new HashMap<>();
            result.put("list", list);
            result.put("paging", paginationInfo);

            return ResponseEntity.ok(DefaultApiResponse.success(result, "조회되었습니다."));
        } catch (Exception e) {
            log.error("위원회 목록 조회 실패", e);
            return ResponseEntity.ok(DefaultApiResponse.error(400, "위원회 목록 조회 실패", "조회 실패"));
        }
    }
    
    /**
     * [조회] 위원회 단건
     */
    @GetMapping("/cmt/detail.do")
    public ResponseEntity<DefaultApiResponse> selectCommittee(@RequestParam int cmtId) {
        try {
            ScCmtMstVO result = commissionService.selectCommittee(cmtId);
            return ResponseEntity.ok(DefaultApiResponse.success(result, "조회되었습니다."));
        } catch (Exception e) {
            log.error("위원회 단건 조회 실패", e);
            return ResponseEntity.ok(DefaultApiResponse.error(400, "위원회 단건 조회 실패", "조회 실패"));
        }
    }

    // [기존 메서드들 유지]
    @PostMapping("/cmt/save.do")
    public ResponseEntity<DefaultApiResponse> saveCommittee(@RequestBody ScCmtMstVO vo) {
        try {
            commissionService.saveManualCommittee(vo);
            return ResponseEntity.ok(DefaultApiResponse.success(vo.getCmtId(), "저장되었습니다."));
        } catch (Exception e) {
            return ResponseEntity.ok(DefaultApiResponse.error(400, "저장 실패", "저장 실패"));
        }
    }

    @PostMapping("/cmt/delete.do")
    public ResponseEntity<DefaultApiResponse> deleteCommittee(@RequestBody Map<String, Object> params) {
        try {
            int cmtId = Integer.parseInt(params.get("cmtId").toString());
            commissionService.deleteCommittee(cmtId);
            return ResponseEntity.ok(DefaultApiResponse.success(null, "삭제되었습니다."));
        } catch (Exception e) {
            return ResponseEntity.ok(DefaultApiResponse.error(400, "삭제 실패", "삭제 실패"));
        }
    }

    @GetMapping("/agnd/list.do")
    public ResponseEntity<DefaultApiResponse> selectAgendaList(@RequestParam int cmtId) {
        try {
            ScAgndMstVO vo = new ScAgndMstVO();
            vo.setCmtId(cmtId);
            List<ScAgndMstVO> list = commissionService.selectAgendaList(vo);
            return ResponseEntity.ok(DefaultApiResponse.success(list, "조회되었습니다."));
        } catch (Exception e) {
            return ResponseEntity.ok(DefaultApiResponse.error(400, "조회 실패", "조회 실패"));
        }
    }

    @PostMapping("/agnd/save.do")
    public ResponseEntity<DefaultApiResponse> saveAgenda(@RequestBody ScAgndMstVO vo) {
        try {
            commissionService.saveManualAgenda(vo);
            return ResponseEntity.ok(DefaultApiResponse.success(vo.getAgndId(), "저장되었습니다."));
        } catch (Exception e) {
            return ResponseEntity.ok(DefaultApiResponse.error(400, "저장 실패", "저장 실패"));
        }
    }

    @PostMapping("/agnd/delete.do")
    public ResponseEntity<DefaultApiResponse> deleteAgenda(@RequestBody Map<String, Object> params) {
        try {
            int agndId = Integer.parseInt(params.get("agndId").toString());
            commissionService.deleteAgenda(agndId);
            return ResponseEntity.ok(DefaultApiResponse.success(null, "삭제되었습니다."));
        } catch (Exception e) {
            return ResponseEntity.ok(DefaultApiResponse.error(400, "삭제 실패", "삭제 실패"));
        }
    }
}
