package incheon.ags.mrb.style.utils;

import java.util.HashMap;
import java.util.Map;

/**
 * SLD 변환 관련 상수 및 매핑 정보
 */
public class SldConstants {

    // 네임스페이스
    public static final String SLD_NAMESPACE = "http://www.opengis.net/sld";
    public static final String OGC_NAMESPACE = "http://www.opengis.net/ogc";
    public static final String XSI_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance";
    public static final String XLINK_NAMESPACE = "http://www.w3.org/1999/xlink";


    /**
     * 줌 레벨을 스케일 분모로 변환
     * OpenLayers 기준: 559082264 / (2^zoom)
     */
    public static int zoomToScaleDenominator(Integer zoom) {
        if (zoom == null) {
            return 559082264;
        }
        return (int) (559082264 / Math.pow(2, zoom));
    }

    /**
     * Well-Known Name 매핑
     */
    public enum WellKnownName {
        SQUARE("square", "square"),
        TRIANGLE("triangle", "triangle"),
        STAR("star", "star"),
        CROSS("cross", "cross"),
        X("x", "x"),
        VERTLINE("shape://vertline", "shape://vertline"),
        SLASH("shape://slash", "shape://slash"),
        BACKSLASH("shape://backslash", "shape://backslash"),
        DOT("shape://dot", "shape://dot"),
        PLUS("shape://plus", "shape://plus"),
        TIMES("shape://times", "shape://times"),
        OARROW("shape://oarrow", "shape://oarrow"),
        CARROW("shape://carrow", "shape://carrow"),
        CIRCLE("circle", "circle"); // 기본값

        private final String key;
        private final String value;

        WellKnownName(String key, String value) {
            this.key = key;
            this.value = value;
        }

        private static final Map<String, String> LOOKUP = new HashMap<>();

        static {
            for (WellKnownName wkn : values()) {
                LOOKUP.put(wkn.key, wkn.value);
            }
        }

        public static String get(String type) {
            return LOOKUP.getOrDefault(type, CIRCLE.value);
        }
    }

    /**
     * 선 스타일을 대시 배열로 변환
     */
    public enum DashArrayStyle {
        DOTTED("dotted", "1 2"),
        DASHED("dashed", "5 5");

        private final String key;
        private final String value;

        DashArrayStyle(String key, String value) {
            this.key = key;
            this.value = value;
        }

        private static final Map<String, String> LOOKUP = new HashMap<>();

        static {
            for (DashArrayStyle style : values()) {
                LOOKUP.put(style.key, style.value);
            }
        }

        public static String get(String style) {
            return LOOKUP.get(style);
        }
    }

    /**
     * Opacity 값을 0-1 범위로 정규화
     */
    public static double normalizeOpacity(Number opacity) {
        if (opacity == null) return 1.0;
        double value = opacity.doubleValue();
        return value > 1.0 ? value / 100.0 : value;
    }
}
