package go.kr.project.carInspectionPenalty.registrationOm.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 자동차 과태료 미필 PRN 파일 파싱 설정
 * application.yml의 car-ffnlg-prn-parse 설정을 바인딩
 *
 * hangul-byte-size 값에 따라 적절한 바이트 길이 설정을 자동으로 선택합니다.
 * - hangul-byte-size: 2 → byte-size-2 설정 사용 (EUC-KR, MS949)
 * - hangul-byte-size: 3 → byte-size-3 설정 사용 (UTF-8)
 *
 * 각 항목별로 지정된 바이트 길이만 설정 (from-to 방식이 아님)
 * 예: no: 6 (6바이트), vhclno: 14 (14바이트)
 * -1 값은 "나머지 전체"를 의미
 */
@Component
@ConfigurationProperties(prefix = "car-ffnlg-prn-parse")
@Data
public class CarFfnlgPrnParseConfig {

    /**
     * 파일 인코딩 (UTF-8, EUC-KR, MS949 등)
     */
    private String encoding;

    /**
     * 한글 문자 바이트 크기
     * 2 = EUC-KR/MS949 (2바이트)
     * 3 = UTF-8 (3바이트)
     */
    private int hangulByteSize;

    /**
     * 2바이트 환경 설정 (EUC-KR, MS949)
     */
    private ByteSizeConfig byteSize2;

    /**
     * 3바이트 환경 설정 (UTF-8)
     */
    private ByteSizeConfig byteSize3;

    /**
     * 바이트 크기별 설정 (first-line, second-line 포함)
     */
    @Data
    public static class ByteSizeConfig {
        /**
         * 첫째줄 필드별 바이트 길이
         */
        private Map<String, Integer> firstLine;

        /**
         * 둘째줄 필드별 바이트 길이
         */
        private Map<String, Integer> secondLine;
    }

    /**
     * 현재 hangul-byte-size에 해당하는 설정 가져오기
     *
     * @return ByteSizeConfig (2바이트 또는 3바이트 설정)
     */
    private ByteSizeConfig getCurrentConfig() {
        if (hangulByteSize == 3) {
            return byteSize3;
        } else {
            // 기본값은 2바이트 (EUC-KR, MS949)
            return byteSize2;
        }
    }

    /**
     * 첫째줄 필드의 바이트 길이 가져오기
     * hangul-byte-size 값에 따라 적절한 설정에서 길이를 반환합니다.
     *
     * @param fieldKey 필드 키 (예: "no", "vhclno")
     * @return 바이트 길이 (-1 = 나머지 전체)
     */
    public int getFirstLineLength(String fieldKey) {
        ByteSizeConfig config = getCurrentConfig();
        if (config == null || config.getFirstLine() == null) {
            return 0;
        }
        Integer length = config.getFirstLine().get(fieldKey);
        return length != null ? length : 0;
    }

    /**
     * 둘째줄 필드의 바이트 길이 가져오기
     * hangul-byte-size 값에 따라 적절한 설정에서 길이를 반환합니다.
     *
     * @param fieldKey 필드 키 (예: "skip", "rrno")
     * @return 바이트 길이 (-1 = 나머지 전체)
     */
    public int getSecondLineLength(String fieldKey) {
        ByteSizeConfig config = getCurrentConfig();
        if (config == null || config.getSecondLine() == null) {
            return 0;
        }
        Integer length = config.getSecondLine().get(fieldKey);
        return length != null ? length : 0;
    }
}
