package incheon.ags.ias.srvy.srvyRspns.service.impl;

import incheon.ags.ias.srvy.srvyRspns.mapper.SrvyRspnsMapper;
import incheon.ags.ias.srvy.srvyRspns.service.SrvyRspnsService;
import incheon.ags.ias.srvy.srvyRspns.vo.SrvyRspnsVO;
import incheon.ags.ias.srvy.srvyRspns.vo.SrvyRspnsSearchVO;
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 org.springframework.util.StringUtils;

import java.util.*;

@Service("srvyRspnsService")
@RequiredArgsConstructor
@Slf4j
public class SrvyRspnsServiceImpl extends EgovAbstractServiceImpl implements SrvyRspnsService {

    private final SrvyRspnsMapper srvyRspnsMapper;

    @Override
    public List<Map<String, Object>> selectSrvyRspnsList(SrvyRspnsSearchVO searchVO) throws Exception {
        return srvyRspnsMapper.selectSrvyRspnsList(searchVO);
    }

    @Override
    public int selectSrvyRspnsListTotCnt(SrvyRspnsSearchVO searchVO) throws Exception {
        return srvyRspnsMapper.selectSrvyRspnsListTotCnt(searchVO);
    }

    @Override
    public SrvyRspnsVO selectSrvyRspnsDetail(SrvyRspnsVO srvyRspnsVO) throws Exception {
        return srvyRspnsMapper.selectSrvyRspnsDetail(srvyRspnsVO);
    }

    @Override
    @Transactional
    public int insertSrvyRspns(SrvyRspnsVO srvyRspnsVO) throws Exception {
        if (srvyRspnsVO.getRspnsSn() == null) {
            // selectKey가 자동으로 설정하므로 수동 설정 제거
            log.info("응답 일련번호는 selectKey에서 자동 생성됩니다.");
        }

        if (!StringUtils.hasText(srvyRspnsVO.getSrvyRspnsCrtUserId())) {
            srvyRspnsVO.setSrvyRspnsCrtUserId("system");
        }
        if (!StringUtils.hasText(srvyRspnsVO.getSrvyRspnsChgUserId())) {
            srvyRspnsVO.setSrvyRspnsChgUserId(srvyRspnsVO.getSrvyRspnsCrtUserId());
        }

        return srvyRspnsMapper.insertSrvyRspns(srvyRspnsVO);
    }

    @Override
    public int updateSrvyRspns(SrvyRspnsVO srvyRspnsVO) throws Exception {
        return srvyRspnsMapper.updateSrvyRspns(srvyRspnsVO);
    }

    @Override
    public int deleteSrvyRspns(SrvyRspnsVO srvyRspnsVO) throws Exception {
        return srvyRspnsMapper.deleteSrvyRspns(srvyRspnsVO);
    }

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

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

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

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

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

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

    @Override
    public List<Map<String, Object>> selectSrvyList(SrvyRspnsVO srvyRspnsVO) throws Exception {
        return srvyRspnsMapper.selectSrvyList(srvyRspnsVO);
    }

    @Override
    public int selectSrvyListCount(SrvyRspnsVO srvyRspnsVO) throws Exception {
        return srvyRspnsMapper.selectSrvyListCount(srvyRspnsVO);
    }

    @Override
    @Transactional
    public int insertMultipleResponses(List<SrvyRspnsVO> responseList) throws Exception {
        int totalInserted = 0;
        
        log.info("다중 응답 저장 시작 - 응답 개수: {}", responseList.size());

        for (int i = 0; i < responseList.size(); i++) {
            SrvyRspnsVO response = responseList.get(i);
            
            log.info("응답 {} 처리 시작 - 설문ID: {}, 문항ID: {}, 선택지ID: {}, 응답내용: {}", 
                    i + 1, response.getSrvySn(), response.getQitemSn(), 
                    response.getArtclSn(), response.getRspnsCn());
            
            if (response.getRspnsSn() == null) {
                // selectKey가 자동으로 설정하므로 수동 설정 제거
                log.info("응답 일련번호는 selectKey에서 자동 생성됩니다.");
            }

            if (!StringUtils.hasText(response.getSrvyRspnsCrtUserId())) {
                response.setSrvyRspnsCrtUserId("system");
            }
            if (!StringUtils.hasText(response.getSrvyRspnsChgUserId())) {
                response.setSrvyRspnsChgUserId(response.getSrvyRspnsCrtUserId());
            }

            try {
                int result = srvyRspnsMapper.insertSrvyRspns(response);
                totalInserted += result;
                log.info("응답 {} 저장 완료 - 결과: {}", i + 1, result);
            } catch (Exception e) {
                log.error("응답 {} 저장 실패 - 설문ID: {}, 문항ID: {}, 에러: {}", 
                        i + 1, response.getSrvySn(), response.getQitemSn(), e.getMessage(), e);
                throw e;
            }
        }

        log.info("다중 응답 저장 완료 - 총 저장 개수: {}", totalInserted);
        return totalInserted;
    }

    @Override
    public boolean validateResponseData(SrvyRspnsVO srvyRspnsVO) throws Exception {
        try {
            if (srvyRspnsVO.getSrvySn() == null) {
                return false;
            }

            if (srvyRspnsVO.getQitemSn() == null) {
                return false;
            }

            if (srvyRspnsVO.getSrvyRspdntSn() == null) {
                return false;
            }

            if (srvyRspnsVO.getArtclSn() != null) {
                return true;
            } else if (StringUtils.hasText(srvyRspnsVO.getRspnsCn())) {
                return true;
            } else {
                return false;
            }

        } catch (Exception e) {
            return false;
        }
    }

    @Override
    public Map<String, Object> getResponseStatisticsSummary(String srvySn) throws Exception {
        Map<String, Object> summary = new HashMap<>();

        try {
            SrvyRspnsVO searchVO = new SrvyRspnsVO();
            searchVO.setSrvySn(Integer.parseInt(srvySn));

            summary.put("totalResponses", 0);
            summary.put("totalRespondents", 0);

        } catch (Exception e) {
            throw e;
        }

        return summary;
    }
}
