package incheon.ags.ias.tmprUserAuthrt.service.impl;

import incheon.ags.ias.tmprUserAuthrt.mapper.TmprUserAuthrtMapper;
import incheon.ags.ias.tmprUserAuthrt.service.TmprUserAuthrtService;
import incheon.ags.ias.tmprUserAuthrt.vo.TmprUserAuthrtSearchVO;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

@Service("tmprUserAuthrtService")
@RequiredArgsConstructor
public class TmprUserAuthrtServiceImpl extends EgovAbstractServiceImpl implements TmprUserAuthrtService {
    private final TmprUserAuthrtMapper tmprUserAuthrtMapper;

    @Override
    public List<Map<String, Object>> selectTmprUserAuthrtList(TmprUserAuthrtSearchVO searchVO) throws Exception {
        return tmprUserAuthrtMapper.selectTmprUserAuthrtList(searchVO);
    }

    @Override
    public int selectTmprUserAuthrtListTotCnt(TmprUserAuthrtSearchVO searchVO) throws Exception {
        return tmprUserAuthrtMapper.selectTmprUserAuthrtListTotCnt(searchVO);
    }

    @Override
    public Map<String, Object> selectTmprUserAuthrtDetail(Map<String, Object> params) throws Exception {
        return tmprUserAuthrtMapper.selectTmprUserAuthrtDetail(params);
    }

    @Override
    public List<Map<String, Object>> selectTmprUserMenuAuthrtList(Map<String, Object> params) throws Exception {
        return tmprUserAuthrtMapper.selectTmprUserMenuAuthrtList(params);
    }

    @Override
    public List<Map<String, Object>> selectTmprUserSysAuthrtList(Map<String, Object> params) throws Exception {
        return tmprUserAuthrtMapper.selectTmprUserSysAuthrtList(params);
    }

    @Override
    public List<Map<String, Object>> selectRoleList() throws Exception {
        return tmprUserAuthrtMapper.selectRoleList();
    }

    @Override
    public List<Map<String, Object>> selectAuthrtList(String sysCd) throws Exception {
        return tmprUserAuthrtMapper.selectAuthrtList(sysCd);
    }

    @Override
    public List<Map<String, Object>> selectMenuListBySysCd(String sysCd) throws Exception {
        return tmprUserAuthrtMapper.selectMenuListBySysCd(sysCd);
    }

    @Override
    public List<Map<String, Object>> selectMenuAuthrtListBySysCd(String sysCd) throws Exception {
        return tmprUserAuthrtMapper.selectMenuAuthrtListBySysCd(sysCd);
    }

    @Override
    public List<Map<String, Object>> selectSysAuthrtListBySysCd(String sysCd) throws Exception {
        return tmprUserAuthrtMapper.selectSysAuthrtListBySysCd(sysCd);
    }

    @Override
    public List<Map<String, Object>> selectSysAuthrtStngList(String sysCd) throws Exception {
        return tmprUserAuthrtMapper.selectSysAuthrtStngList(sysCd);
    }

    @Override
    public List<Map<String, Object>> selectMenuAuthrtStngList(String sysCd) throws Exception {
        return tmprUserAuthrtMapper.selectMenuAuthrtStngList(sysCd);
    }

    @Override
    @Transactional
    public int insertAuthrtStngBatch(List<Map<String, Object>> stngList, String userId) throws Exception {
        int insertCount = 0;

        for (Map<String, Object> stng : stngList) {
            Map<String, Object> params = new HashMap<>();
            params.put("authrtCd", stng.get("authrtCd"));
            params.put("authrtStngTypeCd", stng.get("authrtStngTypeCd"));
            params.put("authrtStngTrgtCd", stng.get("authrtStngTrgtCd"));
            params.put("frstRegId", userId);
            params.put("lastMdfcnId", userId);
            
            // 시스템 코드 설정: SYS 타입이면 AUTHRT_STNG_TRGT_CD를 사용, 아니면 전달된 sysCd 사용
            String authrtStngTypeCd = (String) stng.get("authrtStngTypeCd");
            String sysCd = (String) stng.get("sysCd");
            if ("SYS".equals(authrtStngTypeCd)) {
                sysCd = (String) stng.get("authrtStngTrgtCd");
            }
            params.put("sysCd", sysCd);

            insertCount += tmprUserAuthrtMapper.insertAuthrtStng(params);
        }

        return insertCount;
    }


    @Override
    @Transactional
    public int insertMenuRoleAuthrtMpngBatch(String userId, String roleCd,String sysCd, List<Map<String, Object>> addMenuList, String loginUserId) throws Exception {
        int insertCount = 0;

        for (Map<String, Object> menu : addMenuList) {
            incheon.ags.ias.tmprUserAuthrt.vo.TmprUserAuthrtMenuMpngVO vo = new incheon.ags.ias.tmprUserAuthrt.vo.TmprUserAuthrtMenuMpngVO();
            vo.setUserId(userId);
            vo.setSysCd(sysCd);
            vo.setMenuCd((String) menu.get("menuCd"));
            vo.setRoleCd(roleCd);
            vo.setAuthrtCd((String) menu.get("authrtCd"));
            vo.setFrstRegId(loginUserId);
            vo.setLastMdfcnId(loginUserId);

            insertCount += tmprUserAuthrtMapper.insertMenuRoleAuthrtMpng(vo);
        }

        return insertCount;
    }

    @Override
    public int deleteMenuRoleAuthrtMpng(String userId, String menuCd, String roleCd,String sysCd, String authrtCd) throws Exception {
        Map<String, Object> params = new HashMap<>();
        params.put("userId", userId);  // 추가
        params.put("menuCd", menuCd);
        params.put("roleCd", roleCd);
        params.put("sysCd", sysCd);
        params.put("authrtCd", authrtCd);

        return tmprUserAuthrtMapper.deleteMenuRoleAuthrtMpng(params);
    }

    @Override
    @Transactional
    public int insertSysRoleAuthrtMpngBatch(String userId, String roleCd, String sysCd, List<Map<String, Object>> addSysList, String loginUserId) throws Exception {
        int insertCount = 0;

        for (Map<String, Object> sys : addSysList) {
            incheon.ags.ias.tmprUserAuthrt.vo.TmprUserAuthrtSysMpngVO vo = new incheon.ags.ias.tmprUserAuthrt.vo.TmprUserAuthrtSysMpngVO();
            vo.setUserId(userId);
            vo.setSysCd(sysCd);
            vo.setRoleCd(roleCd);
            vo.setAuthrtCd((String) sys.get("authrtCd"));
            vo.setFrstRegId(loginUserId);
            vo.setLastMdfcnId(loginUserId);

            insertCount += tmprUserAuthrtMapper.insertSysRoleAuthrtMpng(vo);
        }

        return insertCount;
    }

    @Override
    public int deleteSysRoleAuthrtMpng(String userId, String sysCd, String roleCd, String authrtCd) throws Exception {
        Map<String, Object> params = new HashMap<>();
        params.put("userId", userId);  // 추가
        params.put("sysCd", sysCd);
        params.put("roleCd", roleCd);
        params.put("authrtCd", authrtCd);

        return tmprUserAuthrtMapper.deleteSysRoleAuthrtMpng(params);
    }

    @Override
    public List<Map<String, Object>> selectSysList() throws Exception {
        return tmprUserAuthrtMapper.selectSysList();
    }

    @Override
    public List<Map<String, Object>> searchUsers(Map<String, Object> params) throws Exception {
        return tmprUserAuthrtMapper.searchUsers(params);
    }

    @Override
    public int insertTmprUserAuthrt(Map<String, Object> params) throws Exception {
        return tmprUserAuthrtMapper.insertTmprUserAuthrt(params);
    }

    @Override
    @Transactional
    public int deleteAllTmprUserAuthrtByUserId(String userId) throws Exception {
        int deleteCount = 0;
        
        // 1. 사용자별 모든 메뉴 권한 매핑 삭제
        int menuAuthrtCount = tmprUserAuthrtMapper.deleteAllMenuRoleAuthrtMpngByUserId(userId);
        deleteCount += menuAuthrtCount;
        
        // 2. 사용자별 모든 시스템 권한 매핑 삭제
        int sysAuthrtCount = tmprUserAuthrtMapper.deleteAllSysRoleAuthrtMpngByUserId(userId);
        deleteCount += sysAuthrtCount;
        
        // 3. 사용자별 모든 임시 권한 삭제
        int tmprAuthrtCount = tmprUserAuthrtMapper.deleteAllTmprUserAuthrtByUserId(userId);
        deleteCount += tmprAuthrtCount;
        
        return deleteCount;
    }

    @Override
    @Transactional
    public Map<String, Object> deleteTmprUserAuthrtByUserIdAndRoleCdWithDetail(String userId, String roleCd, String sysCd) throws Exception {
        Map<String, Object> result = new HashMap<>();
        
        // 1. 해당 시스템의 메뉴 권한 매핑 삭제
        int menuAuthrtCount = tmprUserAuthrtMapper.deleteMenuRoleAuthrtMpngByUserIdAndRoleCd(userId, roleCd, sysCd);
        
        // 2. 해당 시스템의 시스템 권한 매핑 삭제
        int sysAuthrtCount = tmprUserAuthrtMapper.deleteSysRoleAuthrtMpngByUserIdAndRoleCd(userId, roleCd, sysCd);
        
        // 3. 해당 시스템의 임시 권한 삭제
        int tmprAuthrtCount = tmprUserAuthrtMapper.deleteTmprUserAuthrtByUserIdAndRoleCd(userId, roleCd, sysCd);
        
        int totalCount = menuAuthrtCount + sysAuthrtCount + tmprAuthrtCount;
        
        result.put("totalCount", totalCount);
        result.put("menuAuthrtCount", menuAuthrtCount);
        result.put("sysAuthrtCount", sysAuthrtCount);
        result.put("tmprAuthrtCount", tmprAuthrtCount);
        result.put("actualAuthrtCount", menuAuthrtCount + sysAuthrtCount); // 실제 권한 수 (임시권한 기본 레코드 제외)
        
        return result;
    }

}