package com.its.op.service.its.common;

import com.its.op.dto.its.common.FcltSttsListDto;
import com.its.op.dto.its.common.FcltSttsSummaryDto;
import com.its.op.dto.its.facility.FcltSttsCntDto;
import com.its.op.dto.its.facility.FcltSttsDto;
import com.its.op.service.its.vds.TbVdsCtlrService;
import com.its.op.service.its.vms.TbVmsCtlrService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Slf4j
@RequiredArgsConstructor
@Service
public class CommonSttsService {

    //private final TbCctvCtlrService cctvService;
    private final TbVmsCtlrService vmsService;
    private final TbVdsCtlrService vdsService;
    private final Environment environment;
    private boolean isRunUtis = false;
    //private RsemstService rseService = null;

    @PostConstruct
    void init() {
        this.isRunUtis = Arrays.asList(environment.getActiveProfiles()).contains("utis");
        if (this.isRunUtis) {
            log.info("SUPPORT UTIS INTERFACE.....");
//            this.rseService = (RsemstService) AppUtils.getBean(RsemstService.class);
        }
    }

    /**
     * 시설물 상태정보 조회(통합)
     * @return
     */
    @Transactional(readOnly = true)
    public FcltSttsListDto findAllFcltSttsTotal() {

        FcltSttsListDto result = new FcltSttsListDto();

        // CCTV
//        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(true);
//        result.getFcltList().add(cctv.getFcltList().get(0));

        // VMS
        FcltSttsListDto vms = this.vmsService.findAllSttsListTotal(true);
        result.getFcltList().add(vms.getFcltList().get(0));

        // VDS
        FcltSttsListDto vds = this.vdsService.findAllSttsListTotal(true);
        result.getFcltList().add(vds.getFcltList().get(0));

        return result;
    }

    /**
     * 시설물 상태정보 Summary
     * @return
     */
    @Transactional(readOnly = true)
    public FcltSttsListDto findAllFcltSttsSummary() {
        FcltSttsListDto result = new FcltSttsListDto();

        // CCTV
//        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(false);
//        result.getFcltList().add(cctv.getFcltList().get(0));

        // VMS
        FcltSttsListDto vms = this.vmsService.findAllSttsListTotal(false);
        result.getFcltList().add(vms.getFcltList().get(0));

        // VDS
        FcltSttsListDto vds = this.vdsService.findAllSttsListTotal(false);
        result.getFcltList().add(vds.getFcltList().get(0));

        // RSE
//        if (this.isRunUtis && this.rseService != null) {
//            FcltSttsListDto rse = this.rseService.findAllListSttsTotal(false);
//            result.getFcltList().add(rse.getFcltList().get(0));
//        }

        return result;
    }

    /**
     * ITS 시설물 상태정보 전체 조회
     * findAllFcltSttsTotal 함수와 동일함(전체현황 제외)
     * @return
     */
    @Transactional(readOnly = true)
    public List<FcltSttsDto> findFcltSttsAll() {
        List<FcltSttsDto> result = new ArrayList<>();

        // CCTV
//        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(true);
//        FcltSttsSummaryDto cctvSummary = cctv.getFcltList().get(0);
//        cctvSummary.getFcltObjs().forEach(obj -> {
//            result.add(FcltSttsDto.builder()
//                    .fcltType(obj.getFcltType())
//                    .fcltId(obj.getFcltId())
//                    .fcltNm(obj.getFcltNm())
//                    .fcltNmbr(obj.getFcltNmbr())
//                    .fcltKind(obj.getFcltKind())
//                    .xCrdn(obj.getXCrdn())
//                    .yCrdn(obj.getYCrdn())
//                    .sttsCd(obj.getSttsCd())
//                    .sttsDesc(obj.getSttsDesc())
//                    .strmUrl(obj.getStrmUrl())
//                    .fcltInfo1(obj.getFcltInfo1())
//                    .fcltInfo2(obj.getFcltInfo2())
//                    .build());
//        });

        // VMS
        FcltSttsListDto vms = this.vmsService.findAllSttsListTotal(true);
        FcltSttsSummaryDto vmsSummary = vms.getFcltList().get(0);
        vmsSummary.getFcltObjs().forEach(obj -> {
            result.add(FcltSttsDto.builder()
                    .fcltType(obj.getFcltType())
                    .fcltId(obj.getFcltId())
                    .fcltNm(obj.getFcltNm())
                    .fcltNmbr(obj.getFcltNmbr())
                    .fcltKind(obj.getFcltKind())
                    .xCrdn(obj.getXCrdn())
                    .yCrdn(obj.getYCrdn())
                    .sttsCd(obj.getSttsCd())
                    .sttsDesc(obj.getSttsDesc())
                    .strmUrl(obj.getStrmUrl())
                    .fcltInfo1(obj.getFcltInfo1())
                    .fcltInfo2(obj.getFcltInfo2())
                    .build());
        });

        // VDS
        FcltSttsListDto vds = this.vdsService.findAllSttsListTotal(true);
        FcltSttsSummaryDto vdsSummary = vds.getFcltList().get(0);
        vdsSummary.getFcltObjs().forEach(obj -> {
            result.add(FcltSttsDto.builder()
                    .fcltType(obj.getFcltType())
                    .fcltId(obj.getFcltId())
                    .fcltNm(obj.getFcltNm())
                    .fcltNmbr(obj.getFcltNmbr())
                    .fcltKind(obj.getFcltKind())
                    .xCrdn(obj.getXCrdn())
                    .yCrdn(obj.getYCrdn())
                    .sttsCd(obj.getSttsCd())
                    .sttsDesc(obj.getSttsDesc())
                    .strmUrl(obj.getStrmUrl())
                    .fcltInfo1(obj.getFcltInfo1())
                    .fcltInfo2(obj.getFcltInfo2())
                    .build());
        });

        // RSE
//        if (this.isRunUtis && this.rseService != null) {
//            FcltSttsListDto rse = this.rseService.findAllListSttsTotal(true);
//            FcltSttsSummaryDto rseSummary = rse.getFcltList().get(0);
//            rseSummary.getFcltObjs().forEach(obj -> {
//                result.add(FcltSttsDto.builder()
//                        .fcltType(obj.getFcltType())
//                        .fcltId(obj.getFcltId())
//                        .fcltNm(obj.getFcltNm())
//                        .fcltNmbr(obj.getFcltNmbr())
//                        .fcltKind(obj.getFcltKind())
//                        .xCrdn(obj.getXCrdn())
//                        .yCrdn(obj.getYCrdn())
//                        .sttsCd(obj.getSttsCd())
//                        .sttsDesc(obj.getSttsDesc())
//                        .strmUrl(obj.getStrmUrl())
//                        .fcltInfo1(obj.getFcltInfo1())
//                        .fcltInfo2(obj.getFcltInfo2())
//                        .build());
//            });
//        }

        return result;
    }

    /**
     * ITS 시설물 상태 현황 전체 조회
     * findAllFcltSttsTotal 함수와 동일함
     * @return
     */
    @Transactional(readOnly = true)
    public List<FcltSttsCntDto> findFcltSttsCntAll() {
        List<FcltSttsCntDto> result = new ArrayList<>();

        // CCTV
//        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(false);
//        FcltSttsSummaryDto cctvSummary = cctv.getFcltList().get(0);
//        result.add(FcltSttsCntDto.builder()
//                .fcltType(cctvSummary.getFcltType())
//                .fcltNm(cctvSummary.getFcltNm())
//                .totalCnt(cctvSummary.getTotalCnt())
//                .normalCnt(cctvSummary.getNormalCnt())
//                .errorCnt(cctvSummary.getErrorCnt())
//                .build());

        // VMS
        FcltSttsListDto vms = this.vmsService.findAllSttsListTotal(false);
        FcltSttsSummaryDto vmsSummary = vms.getFcltList().get(0);
        result.add(FcltSttsCntDto.builder()
                .fcltType(vmsSummary.getFcltType())
                .fcltNm(vmsSummary.getFcltNm())
                .totalCnt(vmsSummary.getTotalCnt())
                .normalCnt(vmsSummary.getNormalCnt())
                .errorCnt(vmsSummary.getErrorCnt())
                .build());

        // VDS
        FcltSttsListDto vds = this.vdsService.findAllSttsListTotal(false);
        FcltSttsSummaryDto vdsSummary = vds.getFcltList().get(0);
        result.add(FcltSttsCntDto.builder()
                .fcltType(vdsSummary.getFcltType())
                .fcltNm(vdsSummary.getFcltNm())
                .totalCnt(vdsSummary.getTotalCnt())
                .normalCnt(vdsSummary.getNormalCnt())
                .errorCnt(vdsSummary.getErrorCnt())
                .build());

        // RSE
//        if (this.isRunUtis && this.rseService != null) {
//            FcltSttsListDto rse = this.rseService.findAllListSttsTotal(false);
//            FcltSttsSummaryDto rseSummary = rse.getFcltList().get(0);
//            result.add(FcltSttsCntDto.builder()
//                    .fcltType(rseSummary.getFcltType())
//                    .fcltNm(rseSummary.getFcltNm())
//                    .totalCnt(rseSummary.getTotalCnt())
//                    .normalCnt(rseSummary.getNormalCnt())
//                    .errorCnt(rseSummary.getErrorCnt())
//                    .build());
//        }

        return result;
    }
}
