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

import com.fasterxml.jackson.databind.ObjectMapper;
import incheon.ags.ias.spceUtlz.mapper.SpceUtlzMapper;
import incheon.ags.ias.spceUtlz.service.SpceUtlzService;
import incheon.ags.ias.spceUtlz.vo.GisIndicatorVO;
import incheon.ags.ias.spceUtlz.vo.SpceUtlzSearchVO;
import incheon.ags.ias.spceUtlz.vo.SpceUtlzVO;
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.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service("SpceUtlzService")
@RequiredArgsConstructor
public class SpceUtlzServiceImpl extends EgovAbstractServiceImpl implements SpceUtlzService {
    private final SpceUtlzMapper spceUtlzMapper;
    private final ObjectMapper objectMapper;

    @Override
    public List<SpceUtlzVO> selectWeeklyTop10Users(SpceUtlzSearchVO searchVO) throws Exception {
        return spceUtlzMapper.selectWeeklyTop10Users(searchVO);
    }

    @Override
    public List<SpceUtlzVO> selectWeeklyTop10UsersForExcel(SpceUtlzSearchVO searchVO) throws Exception {
        return spceUtlzMapper.selectWeeklyTop10UsersForExcel(searchVO);
    }

    @Override
    public int selectSpceListTotCnt(SpceUtlzSearchVO searchVO) throws Exception {
        return spceUtlzMapper.selectSpceListTotCnt(searchVO);
    }

    @Override
    public List<GisIndicatorVO> selectGisIndicators() throws Exception {
        List<GisIndicatorVO> indicators = spceUtlzMapper.selectGisIndicators();

        // cdExpln 값을 그대로 weight로 사용
        for (GisIndicatorVO indicator : indicators) {
            if (indicator.getCdExpln() != null && !indicator.getCdExpln().isEmpty()) {
                try {
                    // cdExpln이 숫자 문자열이면 바로 파싱
                    indicator.setWeight(Double.valueOf(indicator.getCdExpln()));
                } catch (Exception e) {
                    log.warn("Failed to parse cdExpln as number for {}: {}", indicator.getCd(), indicator.getCdExpln());
                    indicator.setWeight(0.0);
                }
            } else {
                indicator.setWeight(0.0);
            }
        }

        return indicators;
    }

    @Override
    @Transactional
    public void updateGisIndicatorWeights(List<GisIndicatorVO> indicators, String userId) throws Exception {
        for (GisIndicatorVO indicator : indicators) {
            // weight를 그대로 문자열로 저장
            String cdExpln = String.valueOf(indicator.getWeight().intValue());

            indicator.setCdExpln(cdExpln);
            indicator.setLastMdfcnId(userId);

            spceUtlzMapper.updateGisIndicatorWeight(indicator);
        }
    }

    @Override
    public List<SpceUtlzVO> selectIndicatorStats(SpceUtlzSearchVO searchVO) throws Exception {
        return spceUtlzMapper.selectIndicatorStats(searchVO);
    }
}
