package com.utic.center.utic.stat.server.service;

import com.utic.center.common.annotation.ProcessingElapsed;
import com.utic.center.common.service.AbstractProcessService;
import com.utic.center.utic.stat.server.dao.repository.UticStatParamRepository;
import com.utic.center.utic.stat.server.dto.CodeValueDto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Getter
@RequiredArgsConstructor
@Service
public class UticStatParamService implements AbstractProcessService {

    private final UticStatParamRepository paramRepo;

    private final ConcurrentHashMap<String, CodeValueDto> mapData = new ConcurrentHashMap<>();

    @PostConstruct
    void init() {
        this.mapData.put(CodeValueKey.CODE_00.getKey(), new CodeValueDto("C01", "T01", "Y", 999, 999));
        this.mapData.put(CodeValueKey.CODE_01.getKey(), new CodeValueDto("C01", "T02", "Y", 0, 0));
        this.mapData.put(CodeValueKey.CODE_02.getKey(), new CodeValueDto("C01", "T03", "Y", 30, 30));
        this.mapData.put(CodeValueKey.CODE_03.getKey(), new CodeValueDto("C01", "T04", "Y", 999, 999));
        this.mapData.put(CodeValueKey.CODE_04.getKey(), new CodeValueDto("C01", "T05", "10", 999, 999));
        this.mapData.put(CodeValueKey.CODE_05.getKey(), new CodeValueDto("C01", "T06", "2", 999, 999));

        this.mapData.put(CodeValueKey.CODE_06.getKey(), new CodeValueDto("C02", "T01", "999", 5, 150));
        this.mapData.put(CodeValueKey.CODE_07.getKey(), new CodeValueDto("C02", "T02", "999", 5, 130));
        this.mapData.put(CodeValueKey.CODE_08.getKey(), new CodeValueDto("C02", "T03", "999", 5, 120));
        this.mapData.put(CodeValueKey.CODE_09.getKey(), new CodeValueDto("C02", "T04", "999", 5, 90));
        this.mapData.put(CodeValueKey.CODE_10.getKey(), new CodeValueDto("C02", "T05", "180", 999, 999));
        this.mapData.put(CodeValueKey.CODE_11.getKey(), new CodeValueDto("C02", "T06", "999", 80, 20));
        this.mapData.put(CodeValueKey.CODE_12.getKey(), new CodeValueDto("C02", "T07", "999", 80, 20));
        this.mapData.put(CodeValueKey.CODE_13.getKey(), new CodeValueDto("C02", "T08", "999", 80, 20));
        this.mapData.put(CodeValueKey.CODE_14.getKey(), new CodeValueDto("C02", "T09", "999", 80, 20));
        this.mapData.put(CodeValueKey.CODE_15.getKey(), new CodeValueDto("C02", "T10", "999", 80, 20));
        this.mapData.put(CodeValueKey.CODE_16.getKey(), new CodeValueDto("C02", "T11", "999", 80, 20));
        this.mapData.put(CodeValueKey.CODE_17.getKey(), new CodeValueDto("C02", "T12", "Y", 999, 999));
    }

    @ProcessingElapsed(type="PARAMETER", name="교통정보 파라미터 로딩", starting = false)
    @Override
    public boolean processing() {
        loadCodeValue();
        return true;
    }

    public void loadCodeValue() {
        List<CodeValueDto> result = this.paramRepo.findAllCodeValue();
        if (result != null) {
            for (CodeValueDto dto : result) {
                String key = dto.getMainCode() + dto.getSubCode();
                this.mapData.put(key, dto);
            }
        }
    }

    public CodeValueDto getCodeValue(CodeValueKey codeValueKey) {
        return this.mapData.get(codeValueKey.getKey());
    }

    // 내부 static enum 선언
    @Getter
    public static enum CodeValueKey {
        CODE_00("C01T01"), // 표준편차 필터링
        CODE_01("C01T02"), // 통계기준치 필터링
        CODE_02("C01T03"), // 최대최소값 필터링
        CODE_03("C01T04"), // 최대최소값 필터된 속도 재사용 여부
        CODE_04("C01T05"), // 표준편차 필터링 최소 데이터수
        CODE_05("C01T06"), // 표준편차 시그마 값
        CODE_06("C02T01"), // 고속도로 최대 최소 기준값
        CODE_07("C02T02"), // 도시 고속도로 최대최소 기준값
        CODE_08("C02T03"), // 국도 최대최소 기준값
        CODE_09("C02T04"), // 일반도로 최대최소 기준값
        CODE_10("C02T05"), // 패턴정보 휴효시간
        CODE_11("C02T06"), // 일요일 패턴정보 적용 비율 값
        CODE_12("C02T07"), // 월요일 패턴정보 적용 비율 값
        CODE_13("C02T08"), // 평일 패턴정보 적용 비율 값
        CODE_14("C02T09"), // 금요일 패턴정보 적용 비율 값
        CODE_15("C02T10"), // 토요일 패턴정보 적용 비율 값
        CODE_16("C02T11"), // 휴일 패턴정보 적용 비율 값
        CODE_17("C02T12"); // 패턴결측치 사용여부

        private final String key;

        CodeValueKey(String key) {
            this.key = key;
        }

    }

}
