package com.its.web.service.traffic;

import com.its.web.dto.message.ResultDto;
import com.its.web.dto.traffic.IntersectionCameraDto;
import com.its.web.dto.traffic.IntersectionDto;
import com.its.web.dto.traffic.TbScCmraArrowDto;
import com.its.web.mapper.itcs.IntersectionMapper;
import com.its.web.mapper.its.traffic.TrafficMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

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

@Profile("itcs")
@Slf4j
@RequiredArgsConstructor
@Service
public class IntersectionService {

    private final IntersectionMapper mapper;
    private final TrafficMapper trafficMapper;

    /**
     * 스마트 교차로 전체 정보를 목록으로 조회하여 리턴
     * @return
     */
    public List<IntersectionDto> findAllIntersection() {
        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());
    }

    /**
     * 스마트 교차로 전체 정보를 목록으로 조회하여 리턴
     * @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(Map<String, Object> paramMap) {
        ResultDto result = new ResultDto();
        log.error("paramMap : {}", paramMap);
        int affectedRow = this.mapper.updateCctvHmpgUseYn(paramMap);
        String message = "설정하신 홈페이지 표출정보를 수정하였습니다.";
        String success = "S";
        if (affectedRow <= 0) {
            message = "설정하신 홈페이지 표출정보가 수정되지 않았습니다.";
            success = "F";
        }

        result.setMessage(message);
        result.setSuccess(success);
        return result;
    }
}
