package com.its.web.service.traffic;

import com.its.web.dto.admin.HmpgUseYnDto;
import com.its.web.dto.message.ResultDto;
import com.its.web.dto.traffic.*;
import com.its.web.mapper.itcs.IntersectionMapper;
import com.its.web.mapper.its.traffic.TrafficMapper;
import com.its.web.util.CommonUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

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

@Slf4j
@RequiredArgsConstructor
@Service
public class IntersectionService {

    private final IntersectionMapper mapper;
    private final TrafficMapper trafficMapper;


    public List<IntersectionDvsnDto> getIxrComboList() {
        return mapper.getIxrComboList();
    }
    /**
     * 스마트 교차로 전체 정보를 목록으로 조회하여 리턴
     * @return
     */
    public IntersectionCameraCountDto findAllIntersection(String dvsn) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("dvsn",dvsn);
        IntersectionCameraCountDto result =  mapper.getIxrCameraCount(paramMap);
        List<IntersectionCameraDto> camera = mapper.findEditCameraList(paramMap);
        result.setIntList(new ArrayList<>());
        Map<String, Boolean> checkMap = new HashMap<>();
        for (IntersectionCameraDto dto : camera) {
            if (checkMap.get(dto.getIxrId()) == null) {
                IntersectionDto ixr =  new IntersectionDto();
                ixr.setIxrId(dto.getIxrId());
                ixr.setIxrNm(dto.getIxrNm());
                ixr.setDetail(new ArrayList<>());
                checkMap.put(dto.getIxrId(), true);
                result.getIntList().add(ixr);
            }
            result.getIntList().get(checkMap.size() - 1).getDetail().add(dto);
        }

        return result;
//        Map<String, IntersectionDto> result = new HashMap<>();
//
//        // 교차로 목록 조회
//        List<IntersectionDto> intersectionDtos = this.mapper.findAllIntersection();
//        intersectionDtos.forEach(crs -> {
//            crs.setDetail(new ArrayList<>());
//            result.put(crs.getIxrId(), crs);
//        });
//
//        // 교차로 카메라 정보를 조회 하여 해당 교차로에 리스트로 추가
//        List<IntersectionCameraDto> details = this.mapper.findAllIntersectionDetail();
//        details.forEach(detl -> {
//            IntersectionDto crsInfo = result.get(detl.getIxrId());
//            if (crsInfo != null) {
//                crsInfo.getDetail().add(detl);
//            }
//            else {
////                log.error("not found crs info: {}", detl);
//            }
//        });
//
//        // 교차로의 소통정보를 조회하여 교차로 정보에 추가
//        List<TbScCmraArrowDto> arrows = this.trafficMapper.findAllIntersectionCameraArrow();
//        for (TbScCmraArrowDto arrow : arrows) {
//            IntersectionDto crsInfo = result.get(arrow.getIxrId());
//            if (crsInfo != null) {
//                for (IntersectionCameraDto detail : crsInfo.getDetail()) {
//                    if (detail.getCmraId().equals(arrow.getCmraId()) &&
//                            detail.getDrctDvsnCd().equals(arrow.getDrctDvsnCd())) {
//                            detail.setStartX(arrow.getStartX());
//                            detail.setStartY(arrow.getStartY());
//                            detail.setEndX(arrow.getEndX());
//                            detail.setEndY(arrow.getEndY());
//                    }
//                }
//            }
//        }
//        return  new ArrayList<>(result.values());
    }

    public List<IntersectionCameraDto> findAllIntersectionCamera() {
        return this.mapper.findAllIntersectionCamera();
    }
    /**
     * 스마트 교차로 전체 정보를 목록으로 조회하여 리턴
     * @return
     */
    public List<IntersectionDto> findIntersectionList() {
        Map<String, IntersectionDto> result = new HashMap<>();

        // 교차로 목록 조회
        List<IntersectionDto> intersectionDtos = this.mapper.findAllIntersection();
        intersectionDtos.forEach(crs -> {
            crs.setDetail(new ArrayList<>());
            result.put(crs.getIxrId(), crs);
        });

        // 교차로 카메라 정보를 조회 하여 해당 교차로에 리스트로 추가
        List<IntersectionCameraDto> details = this.mapper.findAllIntersectionDetail();
        details.forEach(detl -> {
            IntersectionDto crsInfo = result.get(detl.getIxrId());
            if (crsInfo != null && detl.getCmraUseYn() == 1) {
                crsInfo.getDetail().add(detl);
            }
            else {
//                log.error("not found crs info: {}", detl);
            }
        });

        // 교차로의 소통정보를 조회하여 교차로 정보에 추가
        List<TbScCmraArrowDto> arrows = this.trafficMapper.findAllIntersectionCameraArrow();
        for (TbScCmraArrowDto arrow : arrows) {
            IntersectionDto crsInfo = result.get(arrow.getIxrId());
            if (crsInfo != null) {
                for (IntersectionCameraDto detail : crsInfo.getDetail()) {
                    if (detail.getCmraId().equals(arrow.getCmraId()) &&
                        detail.getDrctDvsnCd().equals(arrow.getDrctDvsnCd())) {
                        detail.setStartX(arrow.getStartX());
                        detail.setStartY(arrow.getStartY());
                        detail.setEndX(arrow.getEndX());
                        detail.setEndY(arrow.getEndY());
                    }
                }
            }
        }
        return  new ArrayList<>(result.values());
    }

    public ResultDto updateCctvHmpgUseYn(HmpgUseYnDto param) {
        int affectedRow = this.mapper.updateCctvHmpgUseYn(param);
        String message = "설정하신 홈페이지 표출정보를 수정하였습니다.";
        String success = "S";
        if (affectedRow <= 0) {
            message = "설정하신 홈페이지 표출정보가 수정되지 않았습니다.";
            success = "F";
        }
        return CommonUtil.getResultDto(success, message);
    }

    public ResultDto updateTotalCctvHmpgUseYn(Map<String, Object> paramMap) {
        int affectedRow = this.mapper.updateTotalCctvHmpgUseYn(paramMap);
        String message = "설정하신 홈페이지 표출정보를 수정하였습니다.";
        String success = "S";
        if (affectedRow <= 0) {
            message = "설정하신 홈페이지 표출정보가 수정되지 않았습니다.";
            success = "F";
        }
        return CommonUtil.getResultDto(success, message);
    }
}
