using log4net;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;

namespace Ropin.Inspection.Common.Helper
{
    public class AIProjectHelper
    {
        private readonly IHttpClientFactory _httpClientFactory;
        private static readonly ILog log = LogManager.GetLogger(typeof(AIProjectHelper));
        public static AILoginOutput loginResult;
        public AIProjectHelper(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }
        /// <summary>
        /// 获取token
        /// </summary>
        /// <returns></returns>
        public async Task<AILoginOutput> GetToken()
        {
            if (loginResult != null)
            {
                return loginResult;
            }
            AILoginOutput token = null;
            //string url = string.Format(AIConst.ApiUrl+ AIConst.loginUrl);
            string url =AIConst.ApiUrl + AIConst.loginUrl;
            using (var client = _httpClientFactory.CreateClient())
            {
                var login = new
                {
                    Account = AIConst.userName,
                    Password = AIConst.userPwd
                };
                var loginStr = JsonConvert.SerializeObject(login); 
                var request = new HttpRequestMessage(HttpMethod.Post, url)
                {
                    Content = new StringContent(loginStr, System.Text.Encoding.UTF8, "application/json")
                };
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                try
                {
                    var response = await client.SendAsync(request);
                    response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
                    if (response.IsSuccessStatusCode)
                    {
                        var strReturn = await response.Content.ReadAsStringAsync();
                        AIModel<AILoginOutput> tencentToken = JsonConvert.DeserializeObject<AIModel<AILoginOutput>>(strReturn);
                        if (tencentToken != null && tencentToken.code=="200")
                        {
                            token = tencentToken.result;
                        }
                    }
                }
                catch (HttpRequestException ex)
                {
                    log.Info($"AItoken异常【{ex.Message}】");
                }
                catch (JsonException ex)
                {
                    log.Info($"解析AIToken响应异常【{ex.Message}】");
                }
                catch (Exception ex)
                {
                    log.Info($"获取AIToken时发生未知异常【{ex.Message}】");
                }
            }
            loginResult = token;
            return token;
        }
        /// <summary>
        /// 获取历史报警记录
        /// </summary>
        /// <returns></returns>
        public async Task<AISqlSugarPagedList<AlmRecordOutput>> GetHistoricAlmrecord(string Devno, int Page = 1, int pageSize = 10,long? entityId=null)
        {
            if (loginResult == null)
            {
                loginResult = await GetToken(); 
            }
            if (loginResult==null|| loginResult.RefreshToken==null)
            {
                log.Info($"AI-获取历史报警记录-token 为空");
                return null;
            }
            AISqlSugarPagedList<AlmRecordOutput> almData= null;
            string url = AIConst.ApiUrl + AIConst.HistoricAlmrecord;
            using (var client = _httpClientFactory.CreateClient())
            {
                entityId = entityId ?? AIConst.AIEntityId;
                // 设置请求头,添加 token
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", loginResult.AccessToken);
                var data = new
                {
                    isPage= Page==0?false:true,
                    Page= Page,
                    PageSize=pageSize,
                    SearchKey = Devno,
                    EntityId= entityId,
                    ThirdParty = "",
                    Device_Type="",
                    Event_Code = "",
                    Mistake=false,
                    //StartTimeRange = ["",""]
                };
                var dataStr = JsonConvert.SerializeObject(data);
                var request = new HttpRequestMessage(HttpMethod.Post, url)
                {
                    Content = new StringContent(dataStr, System.Text.Encoding.UTF8, "application/json")
                };
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                try
                {
                    var response = await client.SendAsync(request);
                    response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
                    if (response.IsSuccessStatusCode)
                    {
                        var strReturn = await response.Content.ReadAsStringAsync();
                        AIModel<AISqlSugarPagedList<AlmRecordOutput>> ResponseRestult = JsonConvert.DeserializeObject<AIModel<AISqlSugarPagedList<AlmRecordOutput>>>(strReturn);
                        if (ResponseRestult != null && ResponseRestult.code == "200")
                        {
                            almData = ResponseRestult.result;
                        }
                    }
                }
                catch (HttpRequestException ex)
                {
                    log.Info($"AI-获取历史报警记录-异常【{ex.Message}】");
                }
                catch (JsonException ex)
                {
                    log.Info($"解析AI-获取历史报警记录-响应异常【{ex.Message}】");
                }
                catch (Exception ex)
                {
                    log.Info($"获取AI-获取历史报警记录-时发生未知异常【{ex.Message}】");
                }
            }
            return almData;
        }

        /// <summary>
        /// 获取报警处理
        /// </summary>
        /// <returns></returns>
        public async Task<AISqlSugarPagedList<AlmRecordOutput>> GetAlmDispose(string Devno, int Page = 1, int pageSize = 10, long? entityId = null)
        {
            if (loginResult == null)
            {
                loginResult = await GetToken();
            }
            if (loginResult == null || loginResult.RefreshToken == null)
            {
                log.Info($"AI-获取历史报警记录-token 为空");
                return null;
            }
            AISqlSugarPagedList<AlmRecordOutput> almData = null;
            string url = AIConst.ApiUrl + AIConst.AlmDispose;
            using (var client = _httpClientFactory.CreateClient())
            {
                entityId = entityId ?? AIConst.AIEntityId;
                // 设置请求头,添加 token
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", loginResult.AccessToken);
                var data = new
                {
                    isPage = Page == 0 ? false : true,
                    Page = Page,
                    PageSize = pageSize,
                    SearchKey = Devno,
                    EntityId = entityId,
                    ThirdParty = "",
                    Device_Type = "",
                    Event_Code = "",
                    Mistake = false,
                    //StartTimeRange = ["",""]
                };
                var dataStr = JsonConvert.SerializeObject(data);
                var request = new HttpRequestMessage(HttpMethod.Post, url)
                {
                    Content = new StringContent(dataStr, System.Text.Encoding.UTF8, "application/json")
                };
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                try
                {
                    var response = await client.SendAsync(request);
                    response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
                    if (response.IsSuccessStatusCode)
                    {
                        var strReturn = await response.Content.ReadAsStringAsync();
                        AIModel<AISqlSugarPagedList<AlmRecordOutput>> ResponseRestult = JsonConvert.DeserializeObject<AIModel<AISqlSugarPagedList<AlmRecordOutput>>>(strReturn);
                        if (ResponseRestult != null && ResponseRestult.code == "200")
                        {
                            almData = ResponseRestult.result;
                        }
                    }
                }
                catch (HttpRequestException ex)
                {
                    log.Info($"AI-获取历史报警记录-异常【{ex.Message}】");
                }
                catch (JsonException ex)
                {
                    log.Info($"解析AI-获取历史报警记录-响应异常【{ex.Message}】");
                }
                catch (Exception ex)
                {
                    log.Info($"获取AI-获取历史报警记录-时发生未知异常【{ex.Message}】");
                }
            }
            return almData;
        }

        /// <summary>
        /// AI报警修改
        /// </summary>
        /// <returns></returns>
        public async Task<bool> UpdateAlm(string dataStr)
        {
            if (loginResult == null)
            {
                loginResult = await GetToken();
            }
            if (loginResult == null || loginResult.RefreshToken == null)
            {
                log.Info($"AI-AI报警修改-token 为空");
                return false;
            }
            bool result = false;
            string url = AIConst.ApiUrl + AIConst.AlmUpdateDispose;
            using (var client = _httpClientFactory.CreateClient())
            {
                // 设置请求头,添加 token
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", loginResult.AccessToken);
                //var data = new
                //{
                //    Id = AlmId
                //};
                //var dataStr = JsonConvert.SerializeObject(data);
                var request = new HttpRequestMessage(HttpMethod.Post, url)
                {
                    Content = new StringContent(dataStr, System.Text.Encoding.UTF8, "application/json")
                };
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                try
                {
                    var response = await client.SendAsync(request);
                    response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
                    if (response.IsSuccessStatusCode)
                    {
                        var strReturn = await response.Content.ReadAsStringAsync();
                        AIModel<object> ResponseRestult = JsonConvert.DeserializeObject<AIModel<object>>(strReturn);
                        if (ResponseRestult != null && ResponseRestult.code == "200")
                        {
                            result = true;
                        }
                        else
                        {
                            log.Info($"AI报警修改-失败【{strReturn}】");
                        }
                    }
                }
                catch (HttpRequestException ex)
                {
                    log.Info($"AI报警修改-异常【{ex.Message}】");
                }
                catch (JsonException ex)
                {
                    log.Info($"AI报警修改-响应异常【{ex.Message}】");
                }
                catch (Exception ex)
                {
                    log.Info($"AI报警修改-时发生未知异常【{ex.Message}】");
                }
            }
            return result;
        }
        /// <summary>
        /// AI报警软删除
        /// </summary>
        /// <returns></returns>
        public async Task<bool> UpdateAlmIsDelete(long AlmId)
        {
            if (loginResult == null)
            {
                loginResult = await GetToken();
            }
            if (loginResult == null || loginResult.RefreshToken == null)
            {
                log.Info($"AI-AI报警软删除-token 为空");
                return false;
            }
            bool result=false;
            string url = AIConst.ApiUrl + AIConst.AlmDeleteDispose;
            using (var client = _httpClientFactory.CreateClient())
            {
                // 设置请求头,添加 token
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", loginResult.AccessToken);
                var data = new
                {
                    Id= AlmId
                };
                var dataStr = JsonConvert.SerializeObject(data);
                var request = new HttpRequestMessage(HttpMethod.Post, url)
                {
                    Content = new StringContent(dataStr, System.Text.Encoding.UTF8, "application/json")
                };
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                try
                {
                    var response = await client.SendAsync(request);
                    response.EnsureSuccessStatusCode(); // 确保响应状态码为成功
                    if (response.IsSuccessStatusCode)
                    {
                        var strReturn = await response.Content.ReadAsStringAsync();
                        AIModel<object> ResponseRestult = JsonConvert.DeserializeObject<AIModel<object>>(strReturn);
                        if (ResponseRestult != null && ResponseRestult.code == "200")
                        {
                            result =true;
                        }
                    }
                }
                catch (HttpRequestException ex)
                {
                    log.Info($"AI报警软删除-异常【{ex.Message}】");
                }
                catch (JsonException ex)
                {
                    log.Info($"AI报警软删除-响应异常【{ex.Message}】");
                }
                catch (Exception ex)
                {
                    log.Info($"AI报警软删除-时发生未知异常【{ex.Message}】");
                }
            }
            return result;
        }
    }
    public class AIModel<T>
    {
        public string code { get; set; }
        public string type { get; set; }
        public string message { get; set; }
        public T result { get; set; }
        public string extras { get; set; }
        public string time { get; set; }
    }
    /// <summary>
    /// 用户登录结果
    /// </summary>
    public class AILoginOutput
    {
        /// <summary>
        /// 令牌Token
        /// </summary>
        public string AccessToken { get; set; }
        /// <summary>
        /// 刷新Token
        /// </summary>
        public string RefreshToken { get; set; }
        private long UserId { get; set; }
        public void SetUserId(long userId)
        {
            UserId = userId;
        }
        public long GetUserId()
        {
            return UserId;
        }
    }

    /// <summary>
    /// 报警记录表输出参数
    /// </summary>
    public class AlmRecordOutput
    {
        /// <summary>
        /// 主键Id
        /// </summary>
        public long Id { get; set; }

        /// <summary>
        /// 第三方
        /// </summary>
        public string ThirdParty { get; set; }
        public string ThirdPartyName { get; set; }

        /// <summary>
        /// 设备Id
        /// </summary>
        public string Device_Id { get; set; }

        /// <summary>
        /// AI设备名称
        /// </summary>
        public string AIDevName { get; set; }
        /// <summary>
        /// 通道ID
        /// </summary>
        public string? MonitorChannel { get; set; }
        /// <summary>
        /// 通道设备ID
        /// </summary>
        public string? MonitorDevice { get; set; }
        /// <summary>
        /// 设备通道在线状态
        /// </summary>
        public string? MonitorChannelStatus { get; set; }
        /// <summary>
        /// 烟感设备名称
        /// </summary>
        public string IotDevName { get; set; }

        /// <summary>
        /// 关联Id
        /// </summary>
        public string? Relation_Id { get; set; }

        /// <summary>
        /// 设备类型
        /// </summary>
        public string? Device_Type { get; set; }

        /// <summary>
        /// 设备类型名称
        /// </summary>
        public string? Device_TypeName { get; set; }

        /// <summary>
        /// 事件Id
        /// </summary>
        public string? Event_Id { get; set; }

        /// <summary>
        /// 事件代码
        /// </summary>
        public string Event_Code { get; set; }

        /// <summary>
        /// 事件名称
        /// </summary>
        public string Event_Name { get; set; }

        /// <summary>
        /// 是否确认
        /// </summary>
        public bool? Confirmed { get; set; }

        /// <summary>
        /// 是否关闭
        /// </summary>
        public bool? Closed { get; set; }

        /// <summary>
        /// 是否误报
        /// </summary>
        public bool? Mistake { get; set; }

        /// <summary>
        /// 是否通知
        /// </summary>
        public string? Notified { get; set; }

        /// <summary>
        /// 发生时间
        /// </summary>
        public DateTime? StartTime { get; set; }

        /// <summary>
        /// 确认时间
        /// </summary>
        public DateTime? ConfirmTime { get; set; }

        /// <summary>
        /// 关闭时间
        /// </summary>
        public DateTime? EndTime { get; set; }

        /// <summary>
        /// 确认者Id
        /// </summary>
        public long? ConfirmUserId { get; set; }

        /// <summary>
        /// 确认者姓名
        /// </summary>
        public string? ConfirmUserName { get; set; }

        /// <summary>
        /// 关闭者Id
        /// </summary>
        public long? CloseUserId { get; set; }

        /// <summary>
        /// 关闭者姓名
        /// </summary>
        public string? CloseUserName { get; set; }
        /// <summary>
        /// 确认内容
        /// </summary>
        public string? ConfrimContent { get; set; }
        /// <summary>
        /// 处理内容
        /// </summary>
        public string? CloseContent { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        public string? Remark { get; set; }
        /// <summary>
        /// 所属实体
        /// </summary>
        public long? EntityId { get; set; }

        /// <summary>
        /// 实体
        /// </summary>
        public string? EntityName { get; set; }

        /// <summary>
        /// 区域Id
        /// </summary>
        public long? AreaId { get; set; }

        /// <summary>
        /// 区域
        /// </summary>
        public string? AreaName { get; set; }
        /// <summary>
        /// 全景图ID
        /// </summary>
        public string? PanoramaId { get; set; }

        /// <summary>
        /// 全景图Url
        /// </summary>
        public string? PanoramaUrl { get; set; }

        /// <summary>
        /// Roi框
        /// </summary>
        public string? RoiJson { get; set; }

        /// <summary>
        /// NonRoi框
        /// </summary>
        public string? NonRoiJson { get; set; }

        /// <summary>
        /// 检测框
        /// </summary>
        public string? DetectionFrameJson { get; set; }
        /// <summary>
        /// 安装地址
        /// </summary>
        public string? Address { get; set; }

        /// <summary>
        /// 安装位置
        /// </summary>
        public string? Position { get; set; }

        /// <summary>
        /// 租户Id
        /// </summary>
        public long? TenantId { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime? CreateTime { get; set; }

        /// <summary>
        /// 更新时间
        /// </summary>
        public DateTime? UpdateTime { get; set; }

        /// <summary>
        /// 创建者Id
        /// </summary>
        public long? CreateUserId { get; set; }

        /// <summary>
        /// 创建者姓名
        /// </summary>
        public string? CreateUserName { get; set; }

        /// <summary>
        /// 修改者Id
        /// </summary>
        public long? UpdateUserId { get; set; }

        /// <summary>
        /// 修改者姓名
        /// </summary>
        public string? UpdateUserName { get; set; }

        /// <summary>
        /// 软删除
        /// </summary>
        public bool IsDelete { get; set; }
    }
    /// <summary>
    /// 分页泛型集合
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public class AISqlSugarPagedList<TEntity>
    {
        /// <summary>
        /// 页码
        /// </summary>
        public int Page { get; set; }

        /// <summary>
        /// 页容量
        /// </summary>
        public int PageSize { get; set; }

        /// <summary>
        /// 总条数
        /// </summary>
        public int Total { get; set; }

        /// <summary>
        /// 总页数
        /// </summary>
        public int TotalPages { get; set; }

        /// <summary>
        /// 当前页集合
        /// </summary>
        public IEnumerable<TEntity> Items { get; set; }

        /// <summary>
        /// 是否有上一页
        /// </summary>
        public bool HasPrevPage { get; set; }

        /// <summary>
        /// 是否有下一页
        /// </summary>
        public bool HasNextPage { get; set; }
    }
    public static class AIConst
    {
        /// <summary>
        /// 用户名-cszg
        /// </summary>
        public const string userName1 = "cszg";
        /// <summary>
        /// 密码-cszg
        /// </summary>
        public const string userPwd1 = "04aac704c9490f242acf2d9b6e211da5bfae117737a627eacbc0d064414b13ad454833d6d4d38bc3fddd5108319960e38923e94b3f574616f43e8aaff09817e3d25b551b1e5e26c3a402ba1e42e4b58efdbc83357b62ac4f4369b2ce84ca5481541b5b2c683d52d32b6b";
        /// <summary>
        /// 用户名-yszh
        /// </summary>
        public const string userName2 = "yszh";
        /// <summary>
        /// 密码-yszh
        /// </summary>
        public const string userPwd2 = "cf8d0e72832c74b3e566aa83f677c4a35c28fdc3b091cce608949806339a44fb5f523729c1d22fc824e2ea411ab8cae7e373762ccba8641dd2050f04f27d1373c8326f6877668bec57e1c8deace9b2ac1398a5cb5b9eee04c996d8c774ad9c55946708db089e6416cf";
        /// <summary>
        /// 用户名-ropin
        /// </summary>
        public const string userName = "ropin";
        /// <summary>
        /// 密码-ropin
        /// </summary>
        public const string userPwd = "cfa965675d4efbbb0d4a8d5fadf08bad0f780759ab55a414564b87652a015ba44cd8a9ab79dbde503995f7fbffa6a3b1f6322e3d94a4309bed578d8c262e4a3702a4574d20d00d6d54194c7c09b7f4d54cd9d347640de197b1a8f35663c89019b6054415ec7bbb33ef458ecb";
        public const long AIEntityId = 40124884581189;
        public const string ApiUrl = "https://ropiniot.com/prod-api/api";
        public const string ApiUrl1 = "http://localhost:5005/api";
        public const string loginUrl = "/sysAuth/loginNoCode";
        public const string HistoricAlmrecord = "/AlmRecord/HistoryPage";
        public const string AlmDispose = "/AlmRecord/NotPage";
        public const string AlmDeleteDispose = "/AlmRecord/Delete";
        public const string AlmUpdateDispose = "/AlmRecord/AlmRecordUpdate";
    }
}