package gc.mda.signal_batch.global.util;

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 통합선박신호 관련 상수 및 유틸리티
 */
public class IntegrationSignalConstants {

    /**
     * 신호 타입 정의 (우선순위 포함)
     */
    public enum SignalType {
        AIS("000001", "ais", 1),
        VTS_AIS("000004", "vts_ais", 2),
        VPASS("000003", "vpass", 3),
        E_NAVIGATION("000002", "enav", 4),
        D_MF_HF("000016", "d_mf_hf", 5);

        private final String sigSrcCd;
        private final String columnName;
        private final int priority;

        // sig_src_cd로 빠른 조회를 위한 맵
        private static final Map<String, SignalType> BY_SIG_SRC_CD = Arrays.stream(values())
                .collect(Collectors.toMap(SignalType::getSigSrcCd, Function.identity()));

        SignalType(String sigSrcCd, String columnName, int priority) {
            this.sigSrcCd = sigSrcCd;
            this.columnName = columnName;
            this.priority = priority;
        }

        public String getSigSrcCd() {
            return sigSrcCd;
        }

        public String getColumnName() {
            return columnName;
        }

        public int getPriority() {
            return priority;
        }

        /**
         * sig_src_cd로 SignalType 조회
         */
        public static SignalType fromSigSrcCd(String sigSrcCd) {
            return BY_SIG_SRC_CD.get(sigSrcCd);
        }

        /**
         * sig_src_cd에 해당하는 컬럼명 조회
         */
        public static String getColumnNameBySigSrcCd(String sigSrcCd) {
            SignalType type = fromSigSrcCd(sigSrcCd);
            return type != null ? type.getColumnName() : null;
        }
    }

    /**
     * 우선순위 순서 (높음 → 낮음)
     */
    public static final String[] PRIORITY_ORDER = {
            "000001",  // AIS
            "000004",  // VTS-AIS
            "000003",  // VPASS
            "000002",  // E-NAVIGATION
            "000016"   // D-MF/HF
    };

    /**
     * integration_target_id 생성
     * 형식: {AIS}_{ENAV}_{VPASS}_{VTS-AIS}_{D-MF/HF}
     *
     * @param ais     AIS target_id ('0'이면 공백)
     * @param enav    E-NAVIGATION target_id ('0'이면 공백)
     * @param vpass   VPASS target_id ('0'이면 공백)
     * @param vtsAis  VTS-AIS target_id ('0'이면 공백)
     * @param dMfHf   D-MF/HF target_id ('0'이면 공백)
     * @return 통합선박 ID
     */
    public static String generateIntegrationId(String ais, String enav, String vpass,
                                                String vtsAis, String dMfHf) {
        return String.format("%s_%s_%s_%s_%s",
                isZeroOrNull(ais) ? "" : ais,
                isZeroOrNull(enav) ? "" : enav,
                isZeroOrNull(vpass) ? "" : vpass,
                isZeroOrNull(vtsAis) ? "" : vtsAis,
                isZeroOrNull(dMfHf) ? "" : dMfHf
        );
    }

    /**
     * 단독 선박의 integration_target_id 생성
     * 해당 신호 타입 위치에만 target_id 배치
     *
     * @param sigSrcCd 신호 종류 코드
     * @param targetId 대상 ID
     * @return 통합선박 ID
     */
    public static String generateSoloIntegrationId(String sigSrcCd, String targetId) {
        String ais = "", enav = "", vpass = "", vtsAis = "", dMfHf = "";

        SignalType type = SignalType.fromSigSrcCd(sigSrcCd);
        if (type != null) {
            switch (type) {
                case AIS -> ais = targetId;
                case E_NAVIGATION -> enav = targetId;
                case VPASS -> vpass = targetId;
                case VTS_AIS -> vtsAis = targetId;
                case D_MF_HF -> dMfHf = targetId;
            }
        }

        return generateIntegrationId(ais, enav, vpass, vtsAis, dMfHf);
    }

    /**
     * 값이 '0' 또는 null인지 확인
     */
    private static boolean isZeroOrNull(String value) {
        return value == null || "0".equals(value) || value.isEmpty();
    }

    private IntegrationSignalConstants() {
        // 인스턴스화 방지
    }
}
