using LY.App.Common;
using NetTopologySuite.Algorithm;
using NetTopologySuite.Geometries;
using Newtonsoft.Json;
using Pipelines.Sockets.Unofficial.Arenas;
using SqlSugar;
namespace LY.App.Model
{
    /// 
    /// 多边形实体
    /// 
    public class MultPolygonEntity : BaseEntity
    {
        /// 
        /// 空间位置点数据
        /// 
        [SugarColumn(QuerySql = "st_astext(location)", ColumnDataType = "point", ColumnName = "location",
            UpdateSql = "ST_GeomFromText(@location)",
            InsertSql = "ST_GeomFromText(@location)", IsNullable = true, ColumnDescription = "空间位置点数据")]
        [JsonIgnore]
        public string? Location { get; set; } //   Geometry 
        /// 
        /// 空间面数据
        /// 
        [SugarColumn(QuerySql = "st_astext(region)", ColumnDataType = "multipolygon", ColumnName = "region",
            UpdateSql = "ST_GeomFromText(@region)",
            InsertSql = "ST_GeomFromText(@region)", IsNullable = true, ColumnDescription = "空间面数据")]
        [JsonIgnore]
        public string? Region { get; set; } //MultiPolygon  Geometry
        [SugarColumn(IsIgnore = true)]
        public string RegionJson { get; set; }
        /// 
        /// 空间位置点经度
        /// 
        public double Lon { get; set; }
        /// 
        /// 空间位置点纬度
        /// 
        public double Lat { get; set; }
        /// 
        /// 空间位置点Json数据
        /// 
        public void SetRegionJson()
        {
            RegionJson = "";
            if (!string.IsNullOrWhiteSpace(Region))
            {
                var geo = GeoJsonHelper.FromWKT(Region);
                if (geo != null)
                {
                    RegionJson = GeoJsonHelper.GetGeoJson(geo);
                }
            }
        }
        /// 
        /// 设置空间位置点
        /// 
        /// 
        public void SetRegion(MultiPolygon region)
        {
            if (region != null)
            {
                Region = region.AsText();
            }
        }
        /// 
        /// 设置空间位置点
        /// 
        /// 
        /// 
        public void SetLocation(double lon, double lat)
        {
            Lon = lon;
            Lat = lat;
            SetLocation();
        }
        /// 
        /// 设置空间位置点
        /// 
        /// 
        public void SetRegionJson(string region)
        {
            RegionJson = "";
            if (!string.IsNullOrWhiteSpace(region))
            {
                var geo = GeoJsonHelper.FromWKT(region);
                if (geo != null)
                {
                    RegionJson = GeoJsonHelper.GetGeoJson(geo);
                }
            }
        }
        /// 
        /// 设置空间位置点
        /// 
        public void SetLocation()
        {
            Location = $"POINT({Lon} {Lat})";
        }
    }
}