package incheon.ags.ias.menu.web;

import incheon.ags.ias.menu.service.MenuService;
import incheon.ags.ias.menu.vo.MenuVO;
import incheon.ags.ias.menu.web.dto.MenuRequestDTO;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.cmm.context.RequestContext;
import incheon.com.cmm.exception.BusinessException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@Slf4j
public class MenuApiController {
    private final MenuService menuService;

    @PostMapping("/ags/ias/menu/menuRegistAction.do")
    @CacheEvict(value = "headerMenuByUser", allEntries = true)
    public ResponseEntity<DefaultApiResponse<MenuVO>> menuRegistAction(
            @ModelAttribute MenuRequestDTO menuRequestDTO) throws Exception {

        log.info("메뉴 등록 요청: {}", menuRequestDTO.toString());
        log.info("요청 시스템 코드: {}", menuRequestDTO.getSysCd());

        // 현재 접속한 사용자 ID 설정
        String loginUserId = RequestContext.getCurrentUserId();

        MenuVO menuVO = menuRequestDTO.toEntity();

        log.info("변환된 MenuVO - 시스템코드: {}, 메뉴코드: {}", menuVO.getSysCd(), menuVO.getMenuCd());

        menuVO.setFrstRegId(loginUserId);
        menuVO.setLastMdfcnId(loginUserId);

        try {
            int result = menuService.insertMenu(menuVO);

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

            log.info("메뉴 등록 성공 - 메뉴코드: {}", menuVO.getMenuCd());
            return ResponseEntity.ok(
                DefaultApiResponse.success(menuVO, "메뉴가 성공적으로 등록되었습니다.")
            );

        } catch (DuplicateKeyException e) {
            log.error("중복된 메뉴코드 등록 시도", e);
            throw new BusinessException("메뉴코드가 중복되었습니다.");
        }
    }

    @PutMapping("/ags/ias/menu/menuModifyAction/{menuCd}")
    @CacheEvict(value = "headerMenuByUser", allEntries = true)
    public ResponseEntity<DefaultApiResponse<MenuVO>> menuModifyAction(
            @PathVariable String menuCd,
            @ModelAttribute MenuVO menuVO) throws Exception {

        log.info("메뉴 수정 요청 - 메뉴코드: {}, 시스템코드: {}, 데이터: {}", menuCd, menuVO.getSysCd(), menuVO.toString());

        if (menuCd == null || menuCd.trim().isEmpty()) {
            throw new BusinessException("수정할 메뉴 코드가 없습니다.");
        }

        String loginUserId = RequestContext.getCurrentUserId();

        menuVO.setMenuCd(menuCd);
        menuVO.setLastMdfcnId(loginUserId);

        MenuVO existingMenu = new MenuVO();
        existingMenu.setMenuCd(menuCd);
        existingMenu.setSysCd(menuVO.getSysCd());
        MenuVO foundMenu = menuService.selectMenuDetail(existingMenu);

        if (foundMenu == null) {
            throw new BusinessException("수정할 메뉴를 찾을 수 없습니다.");
        }

        int result = menuService.updateMenu(menuVO);

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

        log.info("메뉴 수정 성공 - 메뉴코드: {}", menuCd);
        return ResponseEntity.ok(
            DefaultApiResponse.success(menuVO, "메뉴가 성공적으로 수정되었습니다.")
        );
    }

    @DeleteMapping("/ags/ias/menu/menuDeleteAction/{menuCd}")
    @CacheEvict(value = "headerMenuByUser", allEntries = true)
    public ResponseEntity<DefaultApiResponse<Object>> menuDeleteAction(
            @PathVariable String menuCd,
            @RequestParam String sysCd) throws Exception {

        log.info("메뉴 삭제 요청 - 메뉴코드: {}, 시스템코드: {}", menuCd, sysCd);

        if (menuCd == null || menuCd.trim().isEmpty()) {
            throw new BusinessException("삭제할 메뉴 코드가 없습니다.");
        }

        MenuVO checkMenu = new MenuVO();
        checkMenu.setMenuCd(menuCd);
        checkMenu.setSysCd(sysCd);
        MenuVO foundMenu = menuService.selectMenuDetail(checkMenu);

        if (foundMenu == null) {
            throw new BusinessException("삭제할 메뉴를 찾을 수 없습니다.");
        }

        MenuVO deleteMenu = new MenuVO();
        deleteMenu.setMenuCd(menuCd);
        deleteMenu.setSysCd(sysCd);
        int result = menuService.deleteMenu(deleteMenu);

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

        log.info("메뉴 삭제 성공 - 메뉴코드: {}", menuCd);
        return ResponseEntity.ok(
            DefaultApiResponse.success("메뉴가 성공적으로 삭제되었습니다.")
        );
    }
}