package incheon.ags.cms.monitoring.service.impl;

import incheon.ags.cms.admin.mapper.CleaningAdminMapper;
import incheon.ags.cms.monitoring.service.MonitoringService;
import incheon.ags.cms.monitoring.mapper.MonitoringMapper;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.egovframe.rte.psl.dataaccess.util.EgovMap;
import org.springframework.stereotype.Service;

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

@Service("monitoringService")
@RequiredArgsConstructor
public class MonitoringServiceImpl extends EgovAbstractServiceImpl implements MonitoringService {

    private final MonitoringMapper monitoringMapper;
    private final CleaningAdminMapper cleaningAdminMapper;

    @Override
    public List<EgovMap> selectRealtimeVehicleList(String searchKeyword) throws Exception {

        // 최신 관제규칙
        Map<String, Map<String, Integer>> rule = new HashMap<>();
        List<EgovMap> ruleList = cleaningAdminMapper.selectControlRuleList();
        ruleList.forEach(r -> {
            String clnTypeCd = (String) r.get("clnTypeCd");

            Map<String, Integer> item = new HashMap<>();
            item.put("llmtSpd", (Integer) r.get("llmtSpd"));
            item.put("uplmtSpd", (Integer) r.get("uplmtSpd"));
            item.put("uplmtRadu", (Integer) r.get("uplmtRadu"));

            rule.put(clnTypeCd, item);
        });

        // 신호 리스트를 순회하면서
        List<EgovMap> vehicleList = monitoringMapper.selectRealtimeVehicleList(searchKeyword);
        vehicleList.forEach(v -> {
            // 속도에 한자리 소수점 붙이기
            double spd = v.get("spd") != null ? (((int) v.get("spd")) / 10.0) : 0.0;
            v.put("spd", spd);

            double radu = v.get("radu") != null ? ((Number) v.get("radu")).doubleValue() : 0.0;
            v.put("radu", radu);

            if (v.get("wtspklSecnd") != null) {

                int sec = (int) v.get("wtspklSecnd");

                // 살수중일때(살수초가 0 이상일때 - 살수센스)
                if (0 < sec) {
                    String clnType = (String) v.get("clnTypeCd");
                    int llmtSpd = rule.get(clnType).get("llmtSpd");
                    int uplmtSpd = rule.get(clnType).get("uplmtSpd");
                    int uplmtRadu = rule.get(clnType).get("uplmtRadu");

                    // 속도 체크
                    if (spd < llmtSpd) {
                        v.put("isLlmtSpd", true);
                    } else if (uplmtSpd < spd) {
                        v.put("isUplmtSpd", true);
                    }

                    // 반경 이탈 체크
                    if (uplmtRadu < radu) {
                        v.put("isUplmtRadu", true);
                    }
                }
            }
        });


        return vehicleList;
    }

    @Override
    public List<EgovMap> selectViolationList() throws Exception {

        List<EgovMap> violationList = monitoringMapper.selectViolationList();

        violationList.forEach(v -> {
            // 속도에 한자리 소수점 붙이기
            double spd = v.get("spd") != null ? (((int) v.get("spd")) / 10.0) : 0.0;
            v.put("spd", spd);
        });

        return violationList;
    }

    @Override
    public int updateViolationNotice(Map<String, Object> param) throws Exception {
        return monitoringMapper.updateViolationNotice(param);
    }
}
