package com.ruoyi.bst.areaSub.utils;

import java.math.BigDecimal;
import java.util.List;

import org.locationtech.jts.geom.Geometry;

import com.ruoyi.bst.areaSub.domain.AreaSubVO;
import com.ruoyi.common.utils.collection.CollectionUtils;
import com.ruoyi.common.utils.map.GeoUtils;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class AreaSubUtil {

    /**
     * 获取定位所在的区域
     * @param areaSubList 区域列表
     * @param longitude 经度
     * @param latitude 纬度
     * @param areaError 运营区误差
     * @return 最近的区域
     */
    public static AreaSubVO getInAreaSub(List<AreaSubVO> areaSubList, BigDecimal longitude, BigDecimal latitude, BigDecimal areaError) {
        if (CollectionUtils.isEmptyElement(areaSubList)) {
            return null;
        }
        BigDecimal tolerance = BigDecimal.ZERO; // 误差距离
        if (areaError != null) {
            tolerance = areaError;
        }
        for (AreaSubVO area : areaSubList) {
            Geometry geometry = GeoUtils.fromWkt(area.getBoundary());
            if (geometry == null) {
                continue;
            }
            if(area.getError() != null ){
                tolerance = area.getError();
            }
            boolean inCircle = GeoUtils.isInPolygonWithTolerance(longitude, latitude, geometry, tolerance);
            if (inCircle) {
                return area;
            }
        }
        return null;
    }

    /**
     * 获取靠近的区域
     * @param areaSubList 区域列表
     * @param longitude 经度
     * @param latitude 纬度
     * @param error 误差
     * @return 靠近的区域
     */
    public static AreaSubVO getNearAreaSub(List<AreaSubVO> areaSubList, BigDecimal longitude, BigDecimal latitude, BigDecimal error) {
        if (CollectionUtils.isEmptyElement(areaSubList)) {
            return null;
        }
        for (AreaSubVO area : areaSubList) {
            Geometry geometry = GeoUtils.fromWkt(area.getBoundary());
            if (geometry == null) {
                continue;
            }
            boolean inCircle = GeoUtils.isInPolygonWithTolerance(longitude, latitude, geometry, error);
            if (inCircle) {
                return area;
            }
        }
        return null;
    }

}
