package incheon.ags.ias.sysMenuAuthrt.web;

import incheon.ags.ias.sysMenuAuthrt.service.SysMenuAuthrtService;
import incheon.com.cmm.context.RequestContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class SysMenuAuthrtApiController {
    private final SysMenuAuthrtService sysMenuAuthrtService;

    /**
     * 권한 설정 조회 API (역할 선택 시 호출)
     */
    @GetMapping("/ags/ias/sysMenuAuthrt/getAuthrtStngList.do")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> getAuthrtStngList(@RequestParam(required = false) String sysCd) throws Exception {
        Map<String, Object> result = new HashMap<>();

        try {
            // 메뉴 타입 권한 설정 조회
            List<Map<String, Object>> authrtStngList = sysMenuAuthrtService.selectAuthrtStngList(sysCd);

            // 시스템 전역 권한 조회
            List<Map<String, Object>> systemAuthrtList = sysMenuAuthrtService.selectSystemAuthrtList(sysCd);

            result.put("success", true);
            result.put("authrtStngList", authrtStngList);
            result.put("systemAuthrtList", systemAuthrtList);
        } catch (Exception e) {
            log.error("권한 설정 조회 실패: {}", e.getMessage());
            result.put("success", false);
            result.put("message", "권한 설정 조회에 실패했습니다.");
        }

        return ResponseEntity.ok(result);
    }

    /**
     * 역할 정보 조회 (AJAX) - ROLE_CD + SYS_CD 복합키
     */
    @GetMapping("/ags/ias/sysMenuAuthrt/getRoleInfo.do")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> getRoleInfo(
            @RequestParam String roleCd,
            @RequestParam String sysCd) throws Exception {
        Map<String, Object> result = new HashMap<>();

        try {
            Map<String, Object> params = new HashMap<>();
            params.put("roleCd", roleCd);
            params.put("sysCd", sysCd);

            Map<String, Object> roleInfo = sysMenuAuthrtService.selectRoleInfo(params);
            result.put("success", true);
            result.put("roleInfo", roleInfo);
        } catch (Exception e) {
            log.error("역할 정보 조회 실패: {}", e.getMessage());
            result.put("success", false);
            result.put("message", "역할 정보 조회에 실패했습니다.");
        }

        return ResponseEntity.ok(result);
    }

    /**
     * 메뉴 목록 조회 (AJAX)
     */
    @GetMapping("/ags/ias/sysMenuAuthrt/getMenuList.do")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> getMenuList(@RequestParam(required = false) String sysCd) throws Exception {
        Map<String, Object> result = new HashMap<>();

        try {
            List<Map<String, Object>> menuList = sysMenuAuthrtService.selectMenuListBySysCd(sysCd);
            result.put("success", true);
            result.put("menuList", menuList);
        } catch (Exception e) {
            log.error("메뉴 목록 조회 실패: {}", e.getMessage());
            result.put("success", false);
            result.put("message", "메뉴 목록 조회에 실패했습니다.");
        }

        return ResponseEntity.ok(result);
    }

    /**
     * 시스템 목록 조회 (AJAX) - 통합관리자용
     */
    @GetMapping("/ags/ias/sysMenuAuthrt/getSystemList.do")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> getSystemList() throws Exception {
        Map<String, Object> result = new HashMap<>();

        try {
            List<Map<String, Object>> systemList = sysMenuAuthrtService.selectSystemList();
            result.put("success", true);
            result.put("systemList", systemList);
        } catch (Exception e) {
            log.error("시스템 목록 조회 실패: {}", e.getMessage());
            result.put("success", false);
            result.put("message", "시스템 목록 조회에 실패했습니다.");
        }

        return ResponseEntity.ok(result);
    }

    /**
     * 시스템 코드로 권한 목록 조회 (AJAX) - 모달용
     */
    @GetMapping("/ags/ias/sysMenuAuthrt/getAuthrtListBySysCd.do")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> getAuthrtListBySysCd(@RequestParam(required = false) String sysCd) throws Exception {
        Map<String, Object> result = new HashMap<>();

        try {
            List<Map<String, Object>> authrtList = sysMenuAuthrtService.selectAuthrtList();
            
            java.util.List<Map<String, Object>> filteredList = new java.util.ArrayList<>();
            for (Map<String, Object> authrt : authrtList) {
                Object sysCdObj = authrt.get("sysCd");
                if (sysCdObj == null) {
                    sysCdObj = authrt.get("SYS_CD");
                }
                String authrtSysCd = sysCdObj != null ? sysCdObj.toString() : null;
                
                if (sysCd != null && !sysCd.isEmpty() && authrtSysCd != null && authrtSysCd.equals(sysCd)) {
                    filteredList.add(authrt);
                }
            }
            
            result.put("success", true);
            result.put("authrtList", filteredList);
        } catch (Exception e) {
            log.error("권한 목록 조회 실패: {}", e.getMessage());
            result.put("success", false);
            result.put("message", "권한 목록 조회에 실패했습니다.");
        }

        return ResponseEntity.ok(result);
    }

    /**
     * 권한 설정 적용 (AUTHRT_STNG 테이블 - 전체 재설정 방식)
     */
    @PostMapping("/ags/ias/sysMenuAuthrt/insertAuthrtStng.do")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> insertAuthrtStng(
            @RequestBody Map<String, Object> params) throws Exception {

        Map<String, Object> result = new HashMap<>();

        try {
            // 현재 로그인 사용자 정보
            String userId = RequestContext.getCurrentUserId();


            // 타입과 타겟 정보 추출
            String authrtStngTypeCd = (String) params.get("authrtStngTypeCd");
            String authrtStngTrgtCd = (String) params.get("authrtStngTrgtCd");
            String sysCd = (String) params.get("sysCd");
            List<Map<String, Object>> stngList = (List<Map<String, Object>>) params.get("stngList");

            // 타입과 타겟 정보 필수 체크
            if (authrtStngTypeCd == null || authrtStngTypeCd.isEmpty()
                    || authrtStngTrgtCd == null || authrtStngTrgtCd.isEmpty()) {
                result.put("success", false);
                result.put("message", "권한 설정 타입과 타겟 정보가 필요합니다.");
                return ResponseEntity.ok(result);
            }

            // 전체 재설정 방식으로 처리 (삭제 후 삽입)
            int insertCount = sysMenuAuthrtService.updateAuthrtStngByTarget(
                    authrtStngTypeCd, authrtStngTrgtCd, stngList, userId, sysCd);

            result.put("success", true);
            if (stngList == null || stngList.isEmpty()) {
                result.put("message", "기존 권한 설정이 모두 취소되었습니다.");
            } else {
                result.put("message", insertCount + "건의 권한 설정이 적용되었습니다.");
            }
            result.put("insertCount", insertCount);

        } catch (Exception e) {
            log.error("권한 설정 적용 실패: {}", e.getMessage(), e);
            result.put("success", false);
            result.put("message", "권한 설정 적용에 실패했습니다: " + e.getMessage());
        }

        return ResponseEntity.ok(result);
    }

    /**
     * 메뉴-역할-권한 매핑 수정 (전체 재설정 방식)
     */
    @PostMapping("/ags/ias/sysMenuAuthrt/updateMenuAuthrt.do")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> updateMenuAuthrt(
            @RequestBody Map<String, Object> params) throws Exception {

        Map<String, Object> result = new HashMap<>();

        try {
            // 현재 로그인 사용자 정보
            String userId = RequestContext.getCurrentUserId();


            String roleCd = (String) params.get("roleCd");
            String sysCd = (String) params.get("sysCd");
            List<Map<String, Object>> menuAuthrtList = (List<Map<String, Object>>) params.get("menuAuthrtList");
            List<Map<String, Object>> sysAuthrtList = (List<Map<String, Object>>) params.get("sysAuthrtList");

            if (roleCd == null || roleCd.isEmpty()) {
                result.put("success", false);
                result.put("message", "역할 정보가 누락되었습니다.");
                return ResponseEntity.ok(result);
            }

            if (sysCd == null || sysCd.isEmpty()) {
                result.put("success", false);
                result.put("message", "시스템 코드가 누락되었습니다.");
                return ResponseEntity.ok(result);
            }

            // 서비스 레이어에서 트랜잭션으로 처리
            sysMenuAuthrtService.updateRoleAuthrtMapping(roleCd, sysCd, menuAuthrtList, sysAuthrtList, userId);

            int menuCount = menuAuthrtList != null ? menuAuthrtList.size() : 0;
            int sysCount = sysAuthrtList != null ? sysAuthrtList.size() : 0;

            result.put("success", true);
            result.put("message", String.format("권한이 저장되었습니다. (메뉴: %d건, 시스템: %d건)", menuCount, sysCount));

        } catch (Exception e) {
            log.error("권한 수정 실패: {}", e.getMessage(), e);
            result.put("success", false);
            result.put("message", "권한 수정에 실패했습니다: " + e.getMessage());
        }

        return ResponseEntity.ok(result);
    }

}
