using BBWY.Common.Extensions;
using BBWY.Common.Http;
using BBWY.Common.Models;
using BBWY.Server.Model;
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto;
using FreeSql;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Yitter.IdGenerator;

namespace BBWY.Server.Business
{
    //public class RefundOrderSyncBusiness : BaseSyncBusiness, IDenpendency
    //{
    //    private IDictionary<Enums.Platform, Action<JArray, ShopResponse>> syncRefundOrderMethodDic;

    //    public RefundOrderSyncBusiness(RestApiService restApiService,
    //                                   IOptions<GlobalConfig> options,
    //                                   NLogManager nLogManager,
    //                                   IFreeSql fsql,
    //                                   IIdGenerator idGenerator,
    //                                   TaskSchedulerManager taskSchedulerManager,
    //                                   VenderBusiness venderBusiness) : base(restApiService,
    //                                                                   options,
    //                                                                   nLogManager,
    //                                                                   fsql,
    //                                                                   idGenerator,
    //                                                                   taskSchedulerManager,
    //                                                                   venderBusiness)
    //    {
    //        syncRefundOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, ShopResponse>>()
    //        {
    //            { Enums.Platform.京东, SyncJDRefundOrder}
    //        };
    //    }

    //    private void SyncJDRefundOrder(JArray refundOrderTokenJArray, ShopResponse shopResponse)
    //    {
    //        var shopId = long.Parse(shopResponse.ShopId);
    //        var validRefundOrderTokenJArray = refundOrderTokenJArray.Where(j => j.Value<int>("status") == 13 && j.Value<decimal>("refoundAmount") != 0M).ToList();
    //        var orderIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["orderId"].ToString()).Distinct().ToList();
    //        var orderSkuIds = validRefundOrderTokenJArray.Select(j => j["sameOrderServiceBill"]["wareId"].ToString()).Distinct().ToList();

    //        var updateOrders = fsql.Select<Order>().Where(o => orderIds.Contains(o.Id) && o.IsAfterSaleOrder == false).ToList();
    //        var dbOrderSkus = fsql.Select<OrderSku>().Where(osku => orderIds.Contains(osku.OrderId) && orderSkuIds.Contains(osku.SkuId)).ToList();
    //        var updateOrderSkus = dbOrderSkus.Where(osku => osku.IsRefund == false).ToList();

    //        var afterOrders = fsql.Select<AfterSaleOrder>().Where(aso => orderIds.Contains(aso.OrderId)).ToList();

    //        List<AfterSaleOrder> insertAfterSaleOrders = new List<AfterSaleOrder>();
    //        List<IUpdate<AfterSaleOrder>> updateAfterSaleOrders = new List<IUpdate<AfterSaleOrder>>();

    //        foreach (var refundOrderJToken in validRefundOrderTokenJArray)
    //        {
    //            var skuId = refundOrderJToken["sameOrderServiceBill"]["wareId"].ToString();
    //            var orderId = refundOrderJToken["sameOrderServiceBill"]["orderId"].ToString();

    //            var refundAmount = refundOrderJToken.Value<decimal>("refoundAmount");
    //            var refundCompleteTime = refundOrderJToken.Value<long>("completeTime").StampToDateTime();

    //            var serviceId = refundOrderJToken["sameOrderServiceBill"]["serviceId"].ToString();

    //            var afterOrder = afterOrders.FirstOrDefault(aso => aso.ServiceId == serviceId);
    //            if (afterOrder == null)
    //            {
    //                var dbSku = dbOrderSkus.FirstOrDefault(osku => osku.OrderId == orderId && osku.SkuId == skuId);
    //                if (dbSku == null)
    //                    continue;
    //                insertAfterSaleOrders.Add(new AfterSaleOrder()
    //                {
    //                    Id = idGenerator.NewLong(),
    //                    CreateTime = DateTime.Now,
    //                    OrderId = dbSku.OrderId,
    //                    ProductId = dbSku.ProductId,
    //                    RefundAmount = refundAmount,
    //                    RefundTime = refundCompleteTime,
    //                    SkuId = skuId,
    //                    ShopId = shopId,
    //                    ServiceId = serviceId,
    //                    ApplyTime = long.Parse(refundOrderJToken["sameOrderServiceBill"]["afsApplyTime"].ToString()).StampToDateTime()
    //                });
    //            }
    //            else if (afterOrder.RefundAmount == 0)
    //            {
    //                var update = fsql.Update<AfterSaleOrder>(afterOrder.Id).Set(aso => aso.RefundAmount, refundAmount)
    //                                                                       .Set(aso => aso.RefundTime, refundCompleteTime);
    //                updateAfterSaleOrders.Add(update);
    //            }
    //        }

    //        fsql.Transaction(() =>
    //        {
    //            if (updateOrders.Count() > 0)
    //                foreach (var updateOrder in updateOrders)
    //                    fsql.Update<Order>(updateOrder.Id).Set(o => o.IsAfterSaleOrder, true).ExecuteAffrows();
    //            if (updateOrderSkus.Count() > 0)
    //                foreach (var updateOrderSku in updateOrderSkus)
    //                    fsql.Update<OrderSku>(updateOrderSku.Id).Set(osku => osku.IsRefund, true).ExecuteAffrows();
    //            if (insertAfterSaleOrders.Count() > 0)
    //                fsql.Insert(insertAfterSaleOrders).ExecuteAffrows();
    //            if (updateAfterSaleOrders.Count() > 0)
    //                foreach (var update in updateAfterSaleOrders)
    //                    update.ExecuteAffrows();
    //        });
    //    }

    //    private void SyncRefundOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false)
    //    {
    //        try
    //        {
    //            //logger.Info($"退款订单同步 {shop.ShopName} isAuto {isAuto}");
    //            if (!syncRefundOrderMethodDic.ContainsKey(shop.PlatformId))
    //                throw new Exception("不支持的平台");
    //            var shopId = long.Parse(shop.ShopId);
    //            var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId);
    //            var refundOrderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetRefundList", new SearchRefundPlatformOrderRequest()
    //            {
    //                StartDate = startTime ?? DateTime.Now.Date.AddDays(-5),
    //                EndDate = endTime ?? DateTime.Now,
    //                AppKey = shop.AppKey,
    //                AppSecret = shop.AppSecret,
    //                AppToken = shop.AppToken,
    //                PageIndex = 1,
    //                PageSize = 50,
    //                Platform = shop.PlatformId,
    //                SaveResponseLog = true,
    //                OrderId = orderId
    //            }, null, HttpMethod.Post);
    //            if (refundOrderListApiResult.StatusCode != System.Net.HttpStatusCode.OK)
    //                throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");

    //            var refundOrderListResponse = JsonConvert.DeserializeObject<ApiResponse<JArray>>(refundOrderListApiResult.Content);
    //            if (!refundOrderListResponse.Success)
    //                throw new Exception($"获取退款订单失败 {refundOrderListApiResult.Content}");

    //            if (refundOrderListResponse.Data == null || refundOrderListResponse.Data.Count == 0)
    //                return;

    //            syncRefundOrderMethodDic[shop.PlatformId](refundOrderListResponse.Data, shop);
    //        }
    //        catch (Exception ex)
    //        {
    //            var shopData = JsonConvert.SerializeObject(shop);
    //            logger.Error(ex, $"SyncRefundOrder ShopData:{shopData}");
    //        }
    //    }

    //    public void SyncAllShopRefundOrder()
    //    {
    //        var shopList = venderBusiness.GetShopList();
    //        SyncRefundOrder(shopList.FirstOrDefault(s => s.ShopName == "布莱特玩具专营店"), string.Empty, isAuto: true);
    //        //foreach (var shop in shopList)
    //        //{
    //        //    Task.Factory.StartNew(() => SyncRefundOrder(shop, string.Empty, isAuto: true), System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncRefundOrderTaskScheduler);
    //        //}
    //    }
    //}
}