package incheon.ags.ias.authrt.web;

import incheon.ags.ias.authrt.service.AuthrtService;
import incheon.ags.ias.authrt.vo.AuthrtVO;
import incheon.ags.ias.authrt.web.dto.AuthrtRequestDTO;
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.dao.DuplicateKeyException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequiredArgsConstructor
@Slf4j
public class AuthrtApiController {
    private final AuthrtService authrtService;

    @PostMapping("/ags/ias/authrt/authrtRegistAction.do")
    public ResponseEntity<DefaultApiResponse<AuthrtVO>> authrtRegistAction(
            @ModelAttribute AuthrtRequestDTO authrtRequestDTO,
            HttpServletRequest request) throws Exception {

        log.info("권한 등록 요청: {}", authrtRequestDTO.toString());

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


        AuthrtVO authrtVO = authrtRequestDTO.toEntity();
        authrtVO.setFrstRegId(loginUserId);
        authrtVO.setLastMdfcnId(loginUserId);

        // 권한코드 형식 체크
        if (authrtVO.getAuthrtCd() == null || !authrtVO.getAuthrtCd().startsWith("PERM_")) {
            throw new BusinessException("권한코드는 PERM_으로 시작해야 합니다. 예: PERM_DATA_READ, PERM_FUNC_WRITE");
        }

        // 시스템 권한코드 체크
        if ("PERM_MENU_ACCESS".equals(authrtVO.getAuthrtCd())) {
            throw new BusinessException("PERM_MENU_ACCESS는 시스템에서 사용하는 권한코드로 등록할 수 없습니다.");
        }

        try {
            int result = authrtService.insertAuthrt(authrtVO);
            if (result <= 0) {
                throw new BusinessException("권한 등록에 실패했습니다.");
            }
        } catch (DuplicateKeyException e) {
            log.error("권한 등록 중 중복 오류 발생", e);
            throw new BusinessException("권한 중복이 발생했습니다.");
        }

        log.info("권한 등록 성공 - 권한코드: {}", authrtVO.getAuthrtCd());
        return ResponseEntity.ok(
            DefaultApiResponse.success(authrtVO, "권한이 성공적으로 등록되었습니다.")
        );
    }

    @PutMapping("/ags/ias/authrt/authrtModifyAction.do/{authrtCd}")
    public ResponseEntity<DefaultApiResponse<AuthrtVO>> authrtModifyAction(
            @PathVariable("authrtCd") String authrtCd,
            @ModelAttribute AuthrtRequestDTO authrtRequestDTO,
            HttpServletRequest request) throws Exception {

        log.info("권한 수정 요청 - 권한코드: {}, 데이터: {}", authrtCd, authrtRequestDTO.toString());

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

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


        AuthrtVO authrtVO = authrtRequestDTO.toEntity();
        authrtVO.setAuthrtCd(authrtCd);
        authrtVO.setLastMdfcnId(loginUserId);

        AuthrtVO existingAuthrt = new AuthrtVO();
        existingAuthrt.setAuthrtCd(authrtCd);
        existingAuthrt.setSysCd(authrtRequestDTO.getSysCd());
        AuthrtVO foundAuthrt = authrtService.selectAuthrtDetail(existingAuthrt);

        if (foundAuthrt == null) {
            throw new BusinessException("수정할 권한을 찾을 수 없습니다.");
        }

        // 시스템 권한코드 체크
        if ("PERM_MENU_ACCESS".equals(authrtCd)) {
            throw new BusinessException("PERM_MENU_ACCESS는 시스템에서 사용하는 권한코드로 수정할 수 없습니다.");
        }

        int result = authrtService.updateAuthrt(authrtVO);

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

        log.info("권한 수정 성공 - 권한코드: {}", authrtCd);
        return ResponseEntity.ok(
            DefaultApiResponse.success(authrtVO, "권한이 성공적으로 수정되었습니다.")
        );
    }

    @DeleteMapping("/ags/ias/authrt/authrtDeleteAction.do/{authrtCd}")
    public ResponseEntity<DefaultApiResponse<Object>> authrtDeleteAction(
            @PathVariable("authrtCd") String authrtCd,
            @RequestParam(value = "sysCd", required = false) String sysCd) throws Exception {

        log.info("권한 삭제 요청 - 권한코드: {}", authrtCd);

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

        AuthrtVO checkAuthrt = new AuthrtVO();
        checkAuthrt.setAuthrtCd(authrtCd);
        checkAuthrt.setSysCd(sysCd);
        AuthrtVO foundAuthrt = authrtService.selectAuthrtDetail(checkAuthrt);

        if (foundAuthrt == null) {
            throw new BusinessException("삭제할 권한을 찾을 수 없습니다.");
        }

        // 시스템 권한코드 체크
        if ("PERM_MENU_ACCESS".equals(authrtCd)) {
            throw new BusinessException("PERM_MENU_ACCESS는 시스템에서 사용하는 권한코드로 삭제할 수 없습니다.");
        }

        AuthrtVO deleteAuthrt = new AuthrtVO();
        deleteAuthrt.setAuthrtCd(authrtCd);
        deleteAuthrt.setSysCd(sysCd);

        int result = authrtService.deleteAuthrt(deleteAuthrt);

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

        log.info("권한 삭제 성공 - 권한코드: {}", authrtCd);
        return ResponseEntity.ok(
            DefaultApiResponse.success("권한이 성공적으로 삭제되었습니다.")
        );
    }
}
