package incheon.product.common.geo3d;

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

/**
 * GeoView-3D 제품 설정.
 * 3D 뷰어, 외부 API, GIS Manager 설정을 외부화한다.
 *
 * <pre>
 * geoview3d:
 *   viewer:
 *     initial-longitude: 126.70486
 *     initial-latitude: 37.45247
 *     initial-height: 400
 *     initial-heading: 0
 *     initial-pitch: -44
 *     min-zoom-distance: 150
 *     max-zoom-distance: 500000
 *   traffic-api:
 *     base-url: https://openapi.its.go.kr:9443
 *     api-key: ${trf.api.key:}
 *     connect-timeout-ms: 5000
 *     read-timeout-ms: 7000
 *     traffic-path: /trafficInfo
 *     cctv-path: /cctvInfo
 *   gis-manager:
 *     build-url: ${gis.build.url:}
 *     manager-url: ${gis.manager.url:}
 *     prefix: ${gis.build.prefix:}
 *   external-api:
 *     api-key: ${external.api.key:}
 *   schema:
 *     external: icsgp
 *     main: iccom
 *     ext: icext
 * </pre>
 */
@Component("geoView3DProperties")
@ConfigurationProperties(prefix = "geoview3d")
@Getter @Setter
public class GeoView3DProperties {

    private Viewer viewer = new Viewer();
    private TrafficApi trafficApi = new TrafficApi();
    private GisManager gisManager = new GisManager();
    private ExternalApi externalApi = new ExternalApi();
    private Schema schema = new Schema();
    private Data3d data3d = new Data3d();

    @Getter @Setter
    public static class Viewer {
        private double initialLongitude = 126.70486;
        private double initialLatitude = 37.45247;
        private double initialHeight = 400;
        private double initialHeading = 0;
        private double initialPitch = -44;
        private double minZoomDistance = 150;
        private double maxZoomDistance = 500000;
    }

    @Getter @Setter
    public static class TrafficApi {
        private String baseUrl = "https://openapi.its.go.kr:9443";
        private String apiKey;
        private int connectTimeoutMs = 5000;
        private int readTimeoutMs = 7000;
        private String trafficPath = "/trafficInfo";
        private String cctvPath = "/cctvInfo";
    }

    @Getter @Setter
    public static class GisManager {
        private String buildUrl;
        private String managerUrl;
        private String prefix;
        private int connectTimeoutMs = 10000;
        private int readTimeoutMs = 30000;
    }

    @Getter @Setter
    public static class ExternalApi {
        private String apiKey;
    }

    @Getter @Setter
    public static class Schema {
        private String external = "icsgp";
        private String main = "iccom";
        private String ext = "icext";
    }

    /**
     * 3D 데이터 관리 테이블 설정.
     * 다른 프로젝트에서 테이블명이 다를 경우 application.yml에서 변경 가능.
     */
    @Getter @Setter
    public static class Data3d {
        /** 3D 모델 관리 테이블 (schema.table 형식) */
        private String modelTable = "iccom.dgtltw_mdl_mng";
    }
}
