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

import com.utic.center.common.annotation.ProcessingElapsed;
import com.utic.center.common.service.AbstractProcessService;
import com.utic.center.common.utils.LogUtils;
import com.utic.center.utic.traf.server.config.ApplicationConfig;
import com.utic.center.utic.traf.server.repository.ApplicationRepository;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

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

    private final ApplicationConfig config;
    private final LinkService linkService;
    private final LinkParamService paramService;
    private final LinkPatternService patternService;
    private final LinkTrafCollectService collectService;

    @ProcessingElapsed(type="PRCS", name="교통정보 가공 전처리", starting = false, endLine = true)
    @Override
    public boolean processing() {
        // 가공정보 완료후 기본정보/파라미터정보/패턴정보를 미리 로딩해 놓는다.
        if (this.config.isLoadingLink() || ApplicationRepository.isLoadingLink) {
            // 1년에 한번 바뀌는 것이기 때문에 매번 로딩하는게 의미없다.
            // 수집정보 작업 중 메모리내에 존재하지 않는 링크정보가 있으므로 링크정보를 다시 로딩한다.
            // 패턴정보를 로딩하기 전에 링크정보가 있어야 하기 때문에 링크정보를 먼저 로딩한다.
            log.info("[INF] {}: Link Information Reloading.", LogUtils.elapsedLog("LINK RELOAD"));
            this.linkService.processing();
            ApplicationRepository.isLoadingLink = false;
        }

        initLinkTraf();

        this.paramService.processing(); // 링크 파라미터 정보 로딩
        this.patternService.processing(); // 링크 패턴 정보 로딩
        return true;
    }

    private void initLinkTraf() {
        final long start = System.currentTimeMillis();
        this.linkService.initLinkTraf();
        this.collectService.initialize();
        log.info("[INF] {}", LogUtils.elapsedLog("교통정보 메모리 초기화", System.currentTimeMillis() - start));
    }
}
