package incheon.ags.ias.popupNtc.web;

import incheon.ags.ias.popupNtc.service.PopupNtcService;
import incheon.ags.ias.popupNtc.vo.PopupNtcVO;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.cmm.exception.BusinessException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

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

@RestController
@RequiredArgsConstructor
@Slf4j
public class PopupNtcApiController {

    private final PopupNtcService popupNtcService;

    @PostMapping("/ags/ias/popupNtc/popupNtcRegistAction.do")
    public ResponseEntity<DefaultApiResponse<PopupNtcVO>> popupNtcRegistAction(
            @RequestBody PopupNtcVO popupNtcVO) throws Exception {

        log.info("팝업공지 등록 요청: {}", popupNtcVO.toString());

        // 시스템 코드 기본값 설정
        if (popupNtcVO.getSysCd() == null || popupNtcVO.getSysCd().isEmpty()) {
            popupNtcVO.setSysCd("AGS");
        }

        int result = popupNtcService.insertPopupNtc(popupNtcVO);

        if (result <= 0) {
            throw new BusinessException("팝업공지 등록에 실패했습니다.");
        }

        log.info("팝업공지 등록 성공 - popupNtcSn: {}", popupNtcVO.getPopupNtcSn());
        return ResponseEntity.ok(
                DefaultApiResponse.success(popupNtcVO, "팝업공지가 성공적으로 등록되었습니다.")
        );
    }

    @PutMapping("/ags/ias/popupNtc/popupNtcModifyAction.do/{popupNtcSn}")
    public ResponseEntity<DefaultApiResponse<PopupNtcVO>> popupNtcModifyAction(
            @PathVariable("popupNtcSn") Long popupNtcSn,
            @RequestBody PopupNtcVO popupNtcVO) throws Exception {

        log.info("팝업공지 수정 요청 - popupNtcSn: {}, 데이터: {}", popupNtcSn, popupNtcVO.toString());

        if (popupNtcSn == null) {
            throw new BusinessException("수정할 팝업공지 일련번호가 없습니다.");
        }

        popupNtcVO.setPopupNtcSn(popupNtcSn);

        PopupNtcVO existingPopupNtc = popupNtcService.selectPopupNtcDetail(popupNtcSn);
        if (existingPopupNtc == null) {
            throw new BusinessException("수정할 팝업공지를 찾을 수 없습니다.");
        }

        int result = popupNtcService.updatePopupNtc(popupNtcVO);

        if (result <= 0) {
            throw new BusinessException("팝업공지 수정에 실패했습니다.");
        }

        log.info("팝업공지 수정 성공 - popupNtcSn: {}", popupNtcSn);
        return ResponseEntity.ok(
                DefaultApiResponse.success(popupNtcVO, "팝업공지가 성공적으로 수정되었습니다.")
        );
    }

    @DeleteMapping("/ags/ias/popupNtc/popupNtcDeleteAction.do/{popupNtcSn}")
    public ResponseEntity<DefaultApiResponse<Object>> popupNtcDeleteAction(@PathVariable Long popupNtcSn) throws Exception {
        log.info("팝업공지 삭제 요청 - popupNtcSn: {}", popupNtcSn);

        if (popupNtcSn == null) {
            throw new BusinessException("삭제할 팝업공지 일련번호가 없습니다.");
        }

        PopupNtcVO existingPopupNtc = popupNtcService.selectPopupNtcDetail(popupNtcSn);
        if (existingPopupNtc == null) {
            throw new BusinessException("삭제할 팝업공지를 찾을 수 없습니다.");
        }

        int result = popupNtcService.deletePopupNtc(popupNtcSn);

        if (result <= 0) {
            throw new BusinessException("팝업공지 삭제에 실패했습니다.");
        }

        log.info("팝업공지 삭제 성공 - popupNtcSn: {}", popupNtcSn);
        return ResponseEntity.ok(
                DefaultApiResponse.success("팝업공지가 성공적으로 삭제되었습니다.")
        );
    }

    /**
     * 게시중인 팝업공지 목록 조회 (공개 API - 메인페이지용)
     */
    @GetMapping("/api/v1/popup-ntc/active")
    public ResponseEntity<DefaultApiResponse<List<Map<String, Object>>>> getActivePopupNtcList(
            @RequestParam(defaultValue = "AGS") String sysCd) {

        log.info("게시중인 팝업공지 조회 - sysCd: {}", sysCd);

        List<Map<String, Object>> popupList = popupNtcService.selectActivePopupNtcList(sysCd);

        log.info("게시중인 팝업공지 {}건 조회됨", popupList.size());
        return ResponseEntity.ok(
                DefaultApiResponse.success(popupList)
        );
    }
}
