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

import incheon.ags.ias.myAuthrtAply.mapper.MyAuthrtAplyMapper;
import incheon.ags.ias.myAuthrtAply.service.MyAuthrtAplyService;
import incheon.ags.ias.myAuthrtAply.vo.MyAuthrtAplyVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

@Slf4j
@Service("MyAuthrtAplyService")
@RequiredArgsConstructor
public class MyAuthrtAplyServiceImpl extends EgovAbstractServiceImpl implements MyAuthrtAplyService {
    private final MyAuthrtAplyMapper myAuthrtAplyMapper;

    @Override
    public List<Map<String, Object>> selectSysListWithRoleCnt(MyAuthrtAplyVO myAuthrtAplyVO) throws Exception {
        return myAuthrtAplyMapper.selectSysListWithRoleCnt(myAuthrtAplyVO);
    }

    @Override
    @Transactional
    public int processRoleApplication(MyAuthrtAplyVO myAuthrtAplyVO, List<String> roleCdList) throws Exception {
        try {
            log.info("=== 권한 신청 처리 시작 ===");
            log.info("신청자 ID: {}", myAuthrtAplyVO.getAplcnUserId());
            log.info("대상 사용자 ID: {}", myAuthrtAplyVO.getUserId());
            log.info("시스템 코드: {}", myAuthrtAplyVO.getSysCd());
            log.info("첨부파일 ID: {}", myAuthrtAplyVO.getAtchFileId());
            log.info("역할 개수: {}", roleCdList != null ? roleCdList.size() : 0);
            
            myAuthrtAplyVO.setAplyStcd("APLYSTTSTY004");
            myAuthrtAplyVO.setGrntTypeCd("APPLY");
            myAuthrtAplyVO.setAprvDt(null);
            
            log.info("마스터 등록 시작...");
            int mstResult = myAuthrtAplyMapper.aplyUserRoleMst(myAuthrtAplyVO);
            log.info("마스터 등록 결과: {}, 생성된 APLY_SN: {}", mstResult, myAuthrtAplyVO.getAplySn());
            
            if (mstResult <= 0) {
                log.error("마스터 등록 실패!");
                throw new Exception("신청 마스터 등록에 실패했습니다.");
            }

            if (roleCdList != null && !roleCdList.isEmpty()) {
                log.info("상세 등록 시작 - 역할 개수: {}", roleCdList.size());
                int processedCount = 0;
                for (String roleCd : roleCdList) {
                    processedCount++;
                    log.info("역할 등록 중 [{}/{}]: {}", processedCount, roleCdList.size(), roleCd);

                    MyAuthrtAplyVO dtlVO = new MyAuthrtAplyVO();
                    // MST에서 생성된 aplySn을 DTL에 전달, APLY_DTL_SN은 DB default 사용
                    dtlVO.setAplySn(myAuthrtAplyVO.getAplySn());
                    dtlVO.setAplcnUserId(myAuthrtAplyVO.getAplcnUserId());
                    dtlVO.setSysCd(myAuthrtAplyVO.getSysCd());
                    dtlVO.setRoleCd(roleCd);
                    dtlVO.setUserId(myAuthrtAplyVO.getUserId());

                    int dtlResult = myAuthrtAplyMapper.aplyUserRoleDtl(dtlVO);
                    log.info("역할 등록 결과: {}", dtlResult);

                    if (dtlResult <= 0) {
                        log.error("상세 등록 실패! ROLE_CD: {}", roleCd);
                        throw new Exception("신청 상세 등록에 실패했습니다. ROLE_CD: " + roleCd);
                    }
                }
            }
            
            log.info("=== 권한 신청 처리 완료 ===");
            return 1;

        } catch (Exception e) {
            log.error("권한 신청 처리 중 오류 발생!", e);
            throw e;
        }
    }

    @Override
    public Map<String, Object> selectLatestAply(MyAuthrtAplyVO myAuthrtAplyVO) throws Exception {
        log.debug("최근 신청 정보 조회 (프리셋용) - 사용자ID: {}, 시스템: {}",
                myAuthrtAplyVO.getUserId(), myAuthrtAplyVO.getSysCd());
        return myAuthrtAplyMapper.selectLatestAply(myAuthrtAplyVO);
    }
}
