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

import incheon.ags.ias.sys.mapper.SysMapper;
import incheon.ags.ias.sys.service.SysService;
import incheon.ags.ias.sys.vo.SysSearchVO;
import incheon.ags.ias.sys.vo.SysVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

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

/**
 * 시스템 관리 Service 구현체
 */
@Service("sysmngService")
@RequiredArgsConstructor
@Slf4j
public class SysServiceImpl extends EgovAbstractServiceImpl implements SysService {
    private final SysMapper sysMngMapper;

    /* ========================================
     * 시스템 관련 메서드
     * ======================================== */

    @Override
    public List<Map<String, Object>> selectSysList(SysSearchVO sysSearchVO) throws Exception {
        log.debug("시스템 목록 조회 - 검색조건: {}", sysSearchVO);
        return sysMngMapper.selectSysList(sysSearchVO);
    }

    @Override
    public int selectSysListCnt(SysSearchVO sysSearchVO) throws Exception {
        log.debug("시스템 총 개수 조회 - 검색조건: {}", sysSearchVO);
        return sysMngMapper.selectSysListCnt(sysSearchVO);
    }

    @Override
    public SysVO selectSysDetail(SysVO sysVO) throws Exception {
        log.debug("시스템 상세 조회 - sysCd: {}", sysVO.getSysCd());
        return sysMngMapper.selectSysDetail(sysVO);
    }

    @Override
    public int insertSys(SysVO sysVO) throws Exception {
        log.info("시스템 등록 - sysCd: {}, sysNm: {}", sysVO.getSysCd(), sysVO.getSysNm());
        
        // 필수 필드 검증
        validateSysForInsert(sysVO);
        
        return sysMngMapper.insertSys(sysVO);
    }

    @Override
    public int updateSys(SysVO sysVO) throws Exception {
        log.info("시스템 수정 - sysCd: {}, sysNm: {}", sysVO.getSysCd(), sysVO.getSysNm());
        
        // 필수 필드 검증
        validateSysForUpdate(sysVO);
        
        return sysMngMapper.updateSys(sysVO);
    }

    @Override
    public int deleteSys(SysVO sysVO) throws Exception {
        log.info("시스템 삭제 - sysCd: {}", sysVO.getSysCd());
        
        if (!StringUtils.hasText(sysVO.getSysCd())) {
            throw new IllegalArgumentException("시스템 코드는 필수입니다.");
        }
        
        return sysMngMapper.deleteSys(sysVO);
    }

    /* ========================================
     * 전체 조회 및 부서 관련 메서드
     * ======================================== */

    @Override
    public List<Map<String, Object>> selectAllSysList() throws Exception {
        log.debug("전체 시스템 목록 조회");
        return sysMngMapper.selectAllSysList();
    }

    @Override
    public List<Map<String, Object>> selectSysDeptList() throws Exception {
        log.debug("시스템별 부서 목록 조회");
        return sysMngMapper.selectSysDeptList();
    }

    @Override
    public Map<String, Object> selectSysStatusCnt() throws Exception {
        log.debug("시스템 상태별 개수 조회");
        return sysMngMapper.selectSysStatusCnt();
    }

    @Override
    public List<Map<String, Object>> selectUserCntBySys() throws Exception {
        log.debug("시스템별 사용자 수 조회");
        return sysMngMapper.selectUserCntBySys();
    }

    @Override
    public boolean isSysCdDuplicate(String sysCd) throws Exception {
        log.debug("시스템 코드 중복 체크 - sysCd: {}", sysCd);
        
        if (!StringUtils.hasText(sysCd)) {
            return false;
        }
        
        SysVO searchVO = new SysVO();
        searchVO.setSysCd(sysCd);
        SysVO existingSys = sysMngMapper.selectSysDetail(searchVO);
        
        return existingSys != null;
    }

    /* ========================================
     * Private 메서드
     * ======================================== */

    /**
     * 시스템 등록 시 필수 필드 검증
     */
    private void validateSysForInsert(SysVO sysVO) {
        if (!StringUtils.hasText(sysVO.getSysCd())) {
            throw new IllegalArgumentException("시스템 코드는 필수입니다.");
        }
        if (!StringUtils.hasText(sysVO.getSysNm())) {
            throw new IllegalArgumentException("시스템명은 필수입니다.");
        }
    }

    /**
     * 시스템 수정 시 필수 필드 검증
     */
    private void validateSysForUpdate(SysVO sysVO) {
        if (!StringUtils.hasText(sysVO.getSysCd())) {
            throw new IllegalArgumentException("시스템 코드는 필수입니다.");
        }
        if (!StringUtils.hasText(sysVO.getSysNm())) {
            throw new IllegalArgumentException("시스템명은 필수입니다.");
        }
    }
}