using Fuel.Core;
using Fuel.Core.Models;
using Fuel.Core.Nozzle.Dto;
using Fuel.Core.Transactions.Dto;
using Fuel.Core.WechatServer;
using FuelServer.Core.Entity;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using static FreeSql.Internal.GlobalFilter;

namespace Fuel.Application.Service
{
    public class SiteService : ISiteService
    {
        public readonly IFreeSql _fsql;
        public SiteService(IFreeSql freeSql)
        {
            _fsql = freeSql;
        }
        public async Task<ServiceResponse> AddSite(AddSite site)
        {
            Guid Buid = Guid.NewGuid();
           businessunitinfo bu = new businessunitinfo();

            bu.Buid = Buid;
            bu.Address = site.Address;
            bu.Name = site.Name;
            bu.Appid = site.AppId;
            bu.Secret = site.Secret;
            bu.GpsCoordinates = site.GpsCoordinates;
            bu.PaymentMode = site.PaymentMode == "预支付" ? 1 : 2;
            bu.Phone = site.Phone;
            int affectedRows = _fsql.Insert<businessunitinfo>().AppendData(bu).ExecuteAffrows();

            if (!string.IsNullOrEmpty(site.PayType))
            { 
                configuration configuration = new configuration();
                configuration.Type = 1;
                configuration.Value = site.PayTypeConfiguration;
                configuration.Name = site.PayType;
                configuration.Buid = Buid;
                _fsql.Insert<configuration>().AppendData(configuration).ExecuteAffrows();
            }

            if (!string.IsNullOrEmpty(site.MessageTemplate))
            {
                configuration Message = new configuration();
                Message.Type = 2;
                Message.Value = site.MessageTemplateConfiguration;
                Message.Name = site.MessageTemplate;
                Message.Buid = Buid;
                _fsql.Insert<configuration>().AppendData(Message).ExecuteAffrows();
            }
            return ServiceResponse.Ok(bu);
        }
        public async Task<ServiceResponse> GetSiteInfo()
        {
            Guid Buid = HttpRequestReader.GetCurrentBuId(); //站点id
            string WachatID = HttpRequestReader.GetWachatID(); //用户
            var userSession = WechatUserSessionRepo.GetUserSession(WachatID.ToString());
            if (userSession == null)
            {
                return ServiceResponse.Error(HttpStatusCode.NonAuthoritativeInformation, "未找到用户!");
            }
            var user = _fsql.Select<miniprogramusers>().Where(_ => _.OpenId == userSession.openid).First();
            var site = _fsql.Select<businessunitinfo>().Where(_ => _.Buid == Buid).First();
            var SiteInfo = new
            {
                site = new
                {
                    Name = site.Name,//站点名称
                    GpsCoordinates = site.GpsCoordinates,//油站经纬度
                    PaymentMode = site.PaymentMode,//预支付:1,后支付:2
                },
                userInfo = new
                {
                    UserName = user?.UserName,//用户名称
                    UserAvatarUrl = user?.UserAvatarUrl,//用户头像地址
                    UserAddress = user?.Address,//用户地址
                    UserPhoneNumber = user?.UserPhoneNumber//用户手机号
                }
            };
            return ServiceResponse.Ok(SiteInfo);
        }
        public async Task<ServiceResponse> GetSiteInformationAndConfiguration()
        {
            Guid Buid = HttpRequestReader.GetCurrentBuId(); //站点id
            var site = _fsql.Select<businessunitinfo>().ToList();
            var payinfo = _fsql.Select<configuration>().ToList();
            var SiteInfo = new[] { new { Name = "", Address = "", Phone = "", Appid = "", Secret = "", GpsCoordinates = "", paytype = "", PaymentMode = "" } }.ToList();
            SiteInfo.Clear();
            foreach (var itme in site)
            {
                var PaymentMode = itme.PaymentMode == 1 ? "预支付" : "后支付";
                string paytype = string.Empty;
                if (payinfo.Count > 0)
                {
                     paytype = payinfo.FirstOrDefault(a => a.Buid == Buid && a.Type == 1)?.Name;//获取支付类型
                }

                SiteInfo.Add(
                     new
                     {
                         Name = itme.Name,
                         Address = itme.Address,
                         Phone = itme.Phone,
                         Appid = itme.Appid,
                         Secret = itme.Secret,
                         GpsCoordinates = itme.GpsCoordinates,
                         paytype = paytype,
                         PaymentMode = PaymentMode
                     }
                    );
            }
            return ServiceResponse.Ok(SiteInfo);
        }
        public async Task<ServiceResponse> GetAppidSecret(string Code)
        {
            Guid Buid = HttpRequestReader.GetCurrentBuId(); //站点id
            var site = _fsql.Select<businessunitinfo>().Where(_ => _.Buid == Buid).First();
            if (site == null)
            {
                return ServiceResponse.Error("获取站点小程序appid与Secret失败,BUID:" + Buid);
            }
            WechatUserSessionResponse userSession =
               await WechatLoginCodeToSessionKeyNOpenId(Code, site.Appid, site.Secret);
            if (userSession == null)
            {
                return ServiceResponse.Error("登录失败");
            }
            AccessTokenManager.GetAccessTokenAsync(site.Appid, site.Secret);
            WechatUserSessionRepo.AddUserSession(userSession.openid, userSession);
            return ServiceResponse.Ok(userSession.openid);
        }
        /// <summary>
        /// 微信小程序登录
        /// </summary>
        /// <param name="jsCode"></param>
        /// <param name="AppId"></param>
        /// <param name="AppSecret"></param>
        /// <returns></returns>
        public static async Task<WechatUserSessionResponse> WechatLoginCodeToSessionKeyNOpenId(string jsCode, string AppId, string AppSecret)
        {
            string url = string.Format(WechatConstants.Jscode2sessionUrl,
               AppId, AppSecret, jsCode);
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response = await client.GetAsync(url);
            if (response.IsSuccessStatusCode)
            {
                var responseContent = await response.Content.ReadAsStringAsync();

                var userSession = JsonConvert.DeserializeObject<WechatUserSessionResponse>(responseContent);

                return userSession;
            }
            else
            {
                return null;
            }

        }

        /// <summary>
        /// 添加小程序用户
        /// </summary>
        /// <param name="type">1:新增,2:更新</param>
        /// <param name="UserName"></param>
        /// <param name="UserAvatarUrl"></param>
        /// <param name="UserPhoneNumber"></param>
        /// <param name="Address"></param>
        /// <returns></returns>
        public async Task<ServiceResponse> AddMiniprogramUser(string type, AddWechatUser wechatUser)
        {
            Guid Buid = HttpRequestReader.GetCurrentBuId(); //站点id
            string WachatID = HttpRequestReader.GetWachatID(); //用户
            var userSession = WechatUserSessionRepo.GetUserSession(WachatID.ToString());
            if (userSession == null)
            {
                return ServiceResponse.Error(HttpStatusCode.NonAuthoritativeInformation, "未找到用户!");
            }
            var miniprogramusers = _fsql.Select<miniprogramusers>().Where(_ => _.OpenId == userSession.openid).First();
            if (miniprogramusers != null)
            {
                return ServiceResponse.Ok(miniprogramusers);
            }
            string decryptedData = WeChatService.Decrypt(wechatUser.encryptedData, wechatUser.iv, userSession.session_key);

            JObject jsonObject = JObject.Parse(decryptedData);
            string phoneNumber = jsonObject["phoneNumber"].ToString();
            miniprogramusers user = new miniprogramusers();
            user.Buid = Buid;
            user.UserName = wechatUser.UserName;
            user.UserAvatarUrl = wechatUser.UserAvatarUrl;
            user.UserPhoneNumber = phoneNumber;
            user.Address = wechatUser.Address;
            user.OpenId = userSession.openid;
            user.UnionId = userSession.unionid;
            int affectedRows = _fsql.Insert<miniprogramusers>().AppendData(user).ExecuteAffrows();
            if (affectedRows <= 0)
            {
                return ServiceResponse.Error("用户信息插入失败");
            }
            return ServiceResponse.Ok(user);
        }

        private string GenerateThirdSessionKey()
        {
            var thirdSessionKey = Guid.NewGuid();
            return thirdSessionKey.ToString();
        }

    }
}