package incheon.product.common.config;

import incheon.com.cmm.api.DefaultApiResponse;
import incheon.product.common.geo3d.GeoView3DProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 뷰어 설정 API.
 * Backend application.yml 설정값을 Frontend에서 사용할 수 있도록 JSON으로 반환한다.
 * Frontend config.js의 하드코딩 값 대신 이 API에서 받은 설정을 사용한다.
 */
@Slf4j
@RestController
@RequestMapping("/api/v1/product/config")
public class ViewerConfigApiController {

    @Resource(name = "geoViewProperties")
    private GeoViewProperties geoViewProperties;

    @Resource(name = "geoView3DProperties")
    private GeoView3DProperties geoView3DProperties;

    /**
     * 3D 뷰어 설정을 반환한다.
     * 카메라 초기값, 줌 제약 등 Frontend에서 필요한 설정만 포함.
     */
    @GetMapping("/viewer3d")
    public DefaultApiResponse<Map<String, Object>> getViewer3DConfig() {
        GeoView3DProperties.Viewer viewer = geoView3DProperties.getViewer();

        Map<String, Object> camera = new LinkedHashMap<>();
        camera.put("longitude", viewer.getInitialLongitude());
        camera.put("latitude", viewer.getInitialLatitude());
        camera.put("height", viewer.getInitialHeight());
        camera.put("heading", viewer.getInitialHeading());
        camera.put("pitch", viewer.getInitialPitch());

        Map<String, Object> constraints = new LinkedHashMap<>();
        constraints.put("minZoomDistance", viewer.getMinZoomDistance());
        constraints.put("maxZoomDistance", viewer.getMaxZoomDistance());

        Map<String, Object> config = new LinkedHashMap<>();
        config.put("camera", camera);
        config.put("constraints", constraints);

        return DefaultApiResponse.success(config);
    }

    /**
     * 2D 뷰어 설정을 반환한다.
     * 좌표계, GIS서버 workspace 등 Frontend에서 필요한 설정만 포함.
     */
    @GetMapping("/viewer2d")
    public DefaultApiResponse<Map<String, Object>> getViewer2DConfig() {
        GeoViewProperties.Coordinate coord = geoViewProperties.getCoordinate();

        Map<String, Object> coordinate = new LinkedHashMap<>();
        coordinate.put("defaultSrid", coord.getDefaultSrid());
        coordinate.put("serviceSrid", coord.getServiceSrid());

        Map<String, Object> config = new LinkedHashMap<>();
        config.put("coordinate", coordinate);

        return DefaultApiResponse.success(config);
    }
}
