using Microsoft.AspNetCore.Http;
using System.Net.Http.Json;
using System.Text.Json;
namespace OASystem.API.OAMethodLib.AMapApi
{
    /// <summary>
    /// 高德地图API Service
    /// </summary>
    public class GeocodeService
    {
        private readonly string _apiKey = "2f5a9ef15f598df3170811f50787166a"; // 高德API Key
        private readonly HttpClient _httpClient;

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="httpClient"></param>
        public GeocodeService(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }

        /// <summary>
        /// 获取单个地址的经纬度
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        public async Task<GeocodeResult> GetGeocodeAsync(string address)
        {
            if (string.IsNullOrEmpty(address)) return new GeocodeResult { Address = address, Status = "Failed", Info = "地址为空!" };

            string url = $"https://restapi.amap.com/v3/geocode/geo?key={_apiKey}&address={Uri.EscapeDataString(address)}";
            var response = await _httpClient.GetFromJsonAsync<JsonElement>(url);

            if (response.GetProperty("status").GetString() == "1" && response.GetProperty("geocodes").GetArrayLength() > 0)
            {
                var location = response.GetProperty("geocodes")[0].GetProperty("location").GetString();
                var coordinates = location.Split(',');

                return new GeocodeResult
                {
                    Address = address,
                    Longitude = double.Parse(coordinates[0]),
                    Latitude = double.Parse(coordinates[1]),
                    Status = "Success",
                    Info = "OK"
                };
            }
            else
            {
                return new GeocodeResult
                {
                    Address = address,
                    Status = "Failed",
                    Info = response.GetProperty("info").GetString()
                };
            }
        }

        /// <summary>
        /// 批量获取多个地址的经纬度
        /// </summary>
        /// <param name="addresses"></param>
        /// <param name="qpsLimit"></param>
        /// <returns></returns>
        public async Task<List<GeocodeResult>> GetGeocodesAsync(IEnumerable<string> addresses, int qpsLimit = 3)
        {
            var results = new List<GeocodeResult>();
            for (int i = 0; i < addresses.Count(); i += qpsLimit)
            {
                // 每次处理 qpsLimit 个地址
                var batch = addresses.Skip(i).Take(qpsLimit);

                // 创建并启动任务
                var tasks = batch.Select(GetGeocodeAsync).ToList();
                var batchResults = await Task.WhenAll(tasks);

                // 收集结果
                results.AddRange(batchResults);

                // 如果还有剩余请求,延迟一秒
                if (i + qpsLimit < addresses.Count())
                {
                    await Task.Delay(1000);
                }
            }

            return results;
        }

        public class GeocodeResult
        {
            public string Address { get; set; }
            public double Latitude { get; set; }
            public double Longitude { get; set; }
            public string Status { get; set; }
            public string Info { get; set; }
        }
    }
}