package com.multictrl.common.utils;

import org.locationtech.spatial4j.context.SpatialContext;
import org.locationtech.spatial4j.distance.DistanceUtils;
import org.locationtech.spatial4j.shape.Point;
import org.locationtech.spatial4j.shape.impl.PointImpl;

/**
 * 地理空间工具
 *
 * @author Sdy
 * @since 1.0.0 2026/5/6
 */
public class Spatial4jUtils {

    // 使用 WGS84 坐标系（地球经纬度）
    private static final SpatialContext ctx = SpatialContext.GEO;

    /**
     * 计算两个经纬度点之间的球面距离（单位：米）
     *
     * @param lat1 第一个点纬度
     * @param lon1 第一个点经度
     * @param lat2 第二个点纬度
     * @param lon2 第二个点经度
     * @return 距离，单位：米
     */
    public static double distance(double lat1, double lon1, double lat2, double lon2) {
        Point p1 = new PointImpl(lon1, lat1, ctx);
        Point p2 = new PointImpl(lon2, lat2, ctx);

        return distance(p1, p2);
    }

    /**
     * 如果你已经有 Point 对象，可以直接传入计算
     */
    public static double distance(Point p1, Point p2) {
        // 计算两点之间的角度
        double distanceRad = ctx.getDistCalc().distance(p1, p2);
        // 使用地球平均半径（公里）转为米（弧度*半径）
        return DistanceUtils.degrees2Dist(distanceRad, DistanceUtils.EARTH_MEAN_RADIUS_KM * 1000);
    }

    public static double distance(String lat1Str, String lon1Str, String lat2Str, String lon2Str) {
        try {
            double lat1 = Double.parseDouble(lat1Str);
            double lon1 = Double.parseDouble(lon1Str);
            double lat2 = Double.parseDouble(lat2Str);
            double lon2 = Double.parseDouble(lon2Str);

            return distance(lat1, lon1, lat2, lon2);
        } catch (NumberFormatException e) {
            System.err.println("Invalid input: " + e.getMessage());
            return 0; // 或抛出异常 throw new IllegalArgumentException("Invalid coordinate format", e);
        }
    }
}
