using BBWY.Client.APIServices;
using BBWY.Client.Models;
using BBWY.Client.Views.Order;
using BBWY.Common.Extensions;
using BBWY.Common.Models;
using BBWY.Controls;
using GalaSoft.MvvmLight.Command;
using GalaSoft.MvvmLight.Messaging;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace BBWY.Client.ViewModels
{
    public class OrderListViewModel : BaseVM, IDenpendency
    {
        private OrderService orderService;
        private StatisticsService statisticsService;
        private ChoosePurchaseSchemeViewModel choosePurchaseSchemeViewModel;

        private bool isLoading;

        private string searchOrderId;
        private DateTime startDate;
        private DateTime endDate;
        private int pageIndex = 1;
        private int pageSize = 10;
        private int orderCount;
        private OrderState? orderState;
        private string searchSku;
        private string searchProductNo;
        private string searchContactName;
        private string searchWaybill;
        private bool onlyDF;
        private bool excludeSD;
        private bool excludeCanceled;
        private Random random;

        private GlobalContext globalContext;

        public IList<Order> OrderList { get; set; }

        public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } }

        public string SearchOrderId { get => searchOrderId; set { Set(ref searchOrderId, value); } }

        public DateTime StartDate { get => startDate; set { Set(ref startDate, value); } }

        public DateTime EndDate { get => endDate; set { Set(ref endDate, value); } }

        public int PageIndex { get => pageIndex; set { Set(ref pageIndex, value); } }

        public int PageSize { get => pageSize; set { Set(ref pageSize, value); } }

        public int OrderCount { get => orderCount; set { Set(ref orderCount, value); } }

        public OrderState? OrderState { get => orderState; private set { Set(ref orderState, value); } }

        public string SearchSku { get => searchSku; set { Set(ref searchSku, value); } }
        public string SearchProductNo { get => searchProductNo; set { Set(ref searchProductNo, value); } }
        public string SearchContactName { get => searchContactName; set { Set(ref searchContactName, value); } }
        public string SearchWaybill { get => searchWaybill; set { Set(ref searchWaybill, value); } }

        public bool OnlyDF { get => onlyDF; set { Set(ref onlyDF, value); } }
        public bool ExcludeSD { get => excludeSD; set { Set(ref excludeSD, value); } }
        public bool ExcludeCanceled { get => excludeCanceled; set { Set(ref excludeCanceled, value); } }

        public ToDayOrderAchievement ToDayOrderAchievement { get; set; }

        public ICommand SetOrderStateCommand { get; set; }

        public ICommand SearchOrderCommand { get; set; }

        public ICommand SyncOrderCommand { get; set; }

        public ICommand ExportCommand { get; set; }

        public ICommand CopyTextCommand { get; set; }

        public ICommand CopyOrderWaybillCommand { get; set; }

        public ICommand SetSearchDateCommand { get; set; }

        public ICommand OrderPageIndexChangedCommand { get; set; }

        public ICommand DecodeConsigneeCommand { get; set; }

        public ICommand ChooseStorageTypeCommand { get; set; }

        public ICommand EditCostCommand { get; set; }

        public ICommand OutStockCommand { get; set; }

        public ICommand EditVenderRemarkCommand { get; set; }

        public OrderListViewModel(OrderService orderService, StatisticsService statisticsService, GlobalContext globalContext, ChoosePurchaseSchemeViewModel choosePurchaseSchemeViewModel)
        {
            random = new Random();
            this.globalContext = globalContext;
            this.orderService = orderService;
            this.statisticsService = statisticsService;
            this.choosePurchaseSchemeViewModel = choosePurchaseSchemeViewModel;
            OrderList = new ObservableCollection<Order>();
            EndDate = DateTime.Now;
            StartDate = DateTime.Now.Date.AddDays(-6);
            ToDayOrderAchievement = new ToDayOrderAchievement();
            SetOrderStateCommand = new RelayCommand<OrderState?>(SetOrderState);
            SearchOrderCommand = new RelayCommand(() =>
            {
                PageIndex = 1;
                Task.Factory.StartNew(() => LoadOrder(1));  //手动点击查询订单
                Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate));
            });
            SyncOrderCommand = new RelayCommand(SyncOrder);
            CopyTextCommand = new RelayCommand<string>(s =>
            {
                try
                {
                    Clipboard.SetText(s);
                }
                catch (Exception ex)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(ex);
                    Console.ResetColor();
                }
            }
            );
            CopyOrderWaybillCommand = new RelayCommand<Order>(o => Clipboard.SetText(o.WaybillNo));
            SetSearchDateCommand = new RelayCommand<int>(d =>
            {
                EndDate = d == 1 ? DateTime.Now.Date.AddDays(-1) : DateTime.Now;
                StartDate = DateTime.Now.Date.AddDays(d * -1);
                PageIndex = 1;
                Task.Factory.StartNew(() => LoadOrder(1));  //点击日期查询订单
                Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate));
            });
            OrderPageIndexChangedCommand = new RelayCommand<PageArgs>(p =>
            {
                Task.Factory.StartNew(() => LoadOrder(p.PageIndex));
                Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate));
            });
            DecodeConsigneeCommand = new RelayCommand<Order>(DecodeConsignee);
            ChooseStorageTypeCommand = new RelayCommand<object>(ChooseStorageType);
            EditCostCommand = new RelayCommand<Order>(EditCost);
            OutStockCommand = new RelayCommand<Order>((o) => OutStock(o));
            EditVenderRemarkCommand = new RelayCommand<Order>(EditVenderRemark);
            ExportCommand = new RelayCommand(Export);
            SearchOrderCommand.Execute(null);
        }

        public override void Refresh()
        {
            OrderList.Clear();
            if (ToDayOrderAchievement != null)
            {
                ToDayOrderAchievement.AdvCost = 0M;
                ToDayOrderAchievement.DeliveryExpressFreight = 0M;
                ToDayOrderAchievement.OrderCount = 0;
                ToDayOrderAchievement.Profit = 0;
                ToDayOrderAchievement.PurchaseAmount = 0;
                ToDayOrderAchievement.SaleAmount = 0;
                ToDayOrderAchievement.SaleAmount = 0M;
            }
            PageIndex = 1;
            OrderCount = 0;
        }

        public void SetOrderState(OrderState? orderState)
        {
            this.OrderState = orderState;
            SearchOrderId = String.Empty;
            SearchContactName = String.Empty;
            SearchProductNo = String.Empty;
            SearchSku = String.Empty;
            SearchWaybill = String.Empty;
            EndDate = DateTime.Now;
            StartDate = DateTime.Now.Date.AddDays(-6);
            PageIndex = 1;
            Task.Factory.StartNew(() => LoadOrder(1));  //选择状态查询订单
        }

        public void RefreshOrder(string orderId)
        {
            //Task.Factory.StartNew(() => LoadOrder(PageIndex));
            var order = OrderList.FirstOrDefault(o => o.Id == orderId);
            if (order == null)
            {
                IsLoading = false;
                return;
            }

            var orderResponse = orderService.GetOrderById(orderId);
            IsLoading = false;
            if (!orderResponse.Success)
            {
                Application.Current.Dispatcher.Invoke(() => MessageBox.Show(orderResponse.Msg, "查询订单详情"));
                return;
            }

            var newOrder = orderResponse.Data.Map<Order>();
            if (newOrder.OrderCostDetailList.Count() > 0)
                newOrder.ConvertOrderCostDetailToGroup();

            Application.Current.Dispatcher.Invoke(() =>
            {
                var orderIndex = OrderList.IndexOf(order);
                OrderList.Remove(order);
                OrderList.Insert(orderIndex, newOrder);
            });

        }

        private void LoadOrder(int pageIndex)
        {
            IsLoading = true;
            Thread.Sleep(random.Next(0, 1000));
            var response = orderService.GetOrderList(SearchOrderId,
                                                     StartDate,
                                                     EndDate,
                                                     OrderState,
                                                     SearchSku,
                                                     SearchProductNo,
                                                     SearchWaybill,
                                                     SearchContactName,
                                                     pageIndex,
                                                     pageSize,
                                                     globalContext.User.Shop.ShopId,
                                                     OnlyDF,
                                                     ExcludeSD,
                                                     ExcludeCanceled);
            if (!response.Success)
            {
                IsLoading = false;
                App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "提示"));
                return;
            }
            OrderCount = response.Data.Count;
            var orderList = response.Data.Items.Map<IList<Order>>();
            App.Current.Dispatcher.Invoke(() =>
            {
                OrderList.Clear();
                foreach (var order in orderList)
                {
                    if (order.OrderCostDetailList.Count > 0)
                        order.ConvertOrderCostDetailToGroup();
                    OrderList.Add(order);
                }

                Messenger.Default.Send(string.Empty, "OrderList_OrderListScrollToTop");
            });
            IsLoading = false;
        }

        private void LoadTodayAchievement(DateTime startTime, DateTime endTime)
        {
            var response = statisticsService.GetTodayAchievementStatistics(startTime, endTime);
            if (!response.Success)
                return;
            _ = response.Data.Map(ToDayOrderAchievement);
        }

        private void DecodeConsignee(Order order)
        {
            var plaintextMobile = string.Empty;
            var grab = new GrabJDMibole(order.Id);
            if (grab.ShowDialog() == true)
                plaintextMobile = grab.Tag.ToString();
            if (string.IsNullOrEmpty(plaintextMobile))
            {
                MessageBox.Show("未获取到手机号", "提示");
                return;
            }
            IsLoading = true;
            Task.Factory.StartNew(() => orderService.DecodeConsignee(order.Id, plaintextMobile)).ContinueWith(t =>
            {
                var response = t.Result;
                IsLoading = false;
                if (!response.Success)
                {
                    App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "解密失败"));
                    return;
                }
                order.Consignee.ContactName = response.Data.ContactName;
                order.Consignee.Address = response.Data.Address;
                order.Consignee.Mobile = response.Data.Mobile;
                order.Consignee.IsDecode = true;
            });
        }

        private void ChooseStorageType(object param)
        {
            var paramList = (object[])param;
            var orderId = paramList[0].ToString();
            var storageType = (StorageType)paramList[1];

            var order = OrderList.FirstOrDefault(o => o.Id == orderId);
            if (order.StorageType == storageType)
                return;//忽略相同的仓储类型

            if (storageType == StorageType.本地自发)
            {
                var calculationCostType = new ChooseCalculationCostType(orderId, storageType, true);
                calculationCostType.Closed += ChooseCalculationCostType_Closed;
                calculationCostType.ShowDialog();
            }
            else if (storageType == StorageType.SD)
            {
                var sd = new SD(orderId, true, order.VenderRemark, order.Flag, string.Empty, null, string.Empty, string.Empty, 0M, 0M);
                sd.Closed += Sd_Closed;
                sd.ShowDialog();
            }
            else if (storageType == StorageType.代发)
            {
                var chooseDFType = new ChooseDFType();
                if (chooseDFType.ShowDialog() != true)
                    return;

                if (chooseDFType.DFType == DFType.关联订单)
                {
                    var relationPurchaseOrder = new RelationPurchaseOrder(orderId, globalContext.User.Shop.PurchaseAccountList, null, order.ItemList.Select(osku => new RelationPurchaseOrderSku()
                    {
                        Logo = osku.Logo,
                        ProductId = osku.ProductId,
                        SkuId = osku.Id,
                        Quantity = osku.ItemTotal,
                        Title = osku.Title
                    }).ToList());
                    relationPurchaseOrder.Closed += RelationPurchaseOrder_Closed;
                    relationPurchaseOrder.ShowDialog();
                }
                else if (chooseDFType.DFType == DFType.在线采购)
                {
                    choosePurchaseSchemeViewModel.SetData(order);
                    var choosePurchaseScheme = new ChoosePurchaseScheme();
                    choosePurchaseScheme.ShowDialog();
                }
            }
        }

        private void RelationPurchaseOrder_Closed(object sender, EventArgs e)
        {
            var relationPurchaseOrder = sender as RelationPurchaseOrder;
            if (relationPurchaseOrder.DialogResult != true)
                return;
            var orderDropShippingList = relationPurchaseOrder.OrderDropShippingList;
            var orderId = relationPurchaseOrder.OrderId;
            IsLoading = true;
            Task.Factory.StartNew(() => orderService.RelationPurchaseOrderV2(orderDropShippingList, globalContext.User.Shop.PlatformCommissionRatio ?? 0.05M))
                        .ContinueWith(t =>
                        {
                            var response = t.Result;
                            if (!response.Success)
                            {
                                IsLoading = false;
                                App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "关联采购订单"));
                                return;
                            }
                            RefreshOrder(orderId);
                        });

            //var relationPurchaseOrder = sender as RelationPurchaseOrder;
            //if (relationPurchaseOrder.DialogResult != true)
            //    return;
            //var orderDropShipping = relationPurchaseOrder.OrderDropShipping;
            //var relationPurchaseOrderSkuList = relationPurchaseOrder.RelationPurchaseOrderSkuList;
            //IsLoading = true;
            //Task.Factory.StartNew(() => orderService.RelationPurchaseOrder(orderDropShipping, relationPurchaseOrderSkuList, globalContext.User.Shop.PlatformCommissionRatio ?? 0.05M))
            //            .ContinueWith(r =>
            //            {
            //                var response = r.Result;
            //                if (!response.Success)
            //                {
            //                    IsLoading = false;
            //                    App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "关联采购订单"));
            //                    return;
            //                }
            //                //LoadOrder(PageIndex); //关联订单刷新订单列表
            //                RefreshOrder(orderDropShipping.OrderId);
            //            });
        }

        private void Sd_Closed(object sender, EventArgs e)
        {
            var sd = sender as SD;
            if (sd.DialogResult != true)
                return;
            var orderId = sd.OrderId;
            var isSetStorageType = sd.IsSetStorageType;
            var sdCommissionAmount = sd.SDCommissionAmount;
            var deliveryExpressFreight = sd.DeliveryExpressFreight;
            var sdType = sd.SDType;
            var flag = sd.Flag;
            var venderRemark = sd.VenderRemark;
            var sdKey = sd.SDKey;
            var sdPayChannel = sd.PayChannel;
            var sdPaybillNo = sd.SdPayBillNo;
            var sdOperator = sd.SdOperator;
            IsLoading = true;
            Task.Factory.StartNew(() => orderService.SDCalculationCost(orderId,
                                                                       isSetStorageType,
                                                                       sdCommissionAmount,
                                                                       deliveryExpressFreight,
                                                                       sdType.Value,
                                                                       sdKey,
                                                                       sdPayChannel,
                                                                       sdPaybillNo,
                                                                       sdOperator,
                                                                       flag,
                                                                       venderRemark,
                                                                       globalContext.User.Shop.PlatformCommissionRatio ?? 0.05M))
                        .ContinueWith(r =>
                        {
                            var response = r.Result;
                            if (!response.Success)
                            {
                                IsLoading = false;
                                App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "设置刷单成本"));
                                return;
                            }
                            //LoadOrder(PageIndex); //设置刷单刷新订单列表
                            RefreshOrder(orderId);
                        });
        }

        private void EditCost(Order order)
        {
            if (order.StorageType == null)
                return;
            if (order.StorageType == StorageType.代发)
            {
                var relationPurchaseOrder = new RelationPurchaseOrder(order.Id, globalContext.User.Shop.PurchaseAccountList, order.OrderDropShippingList, order.ItemList.Select(osku => new RelationPurchaseOrderSku()
                {
                    Logo = osku.Logo,
                    ProductId = osku.ProductId,
                    SkuId = osku.Id,
                    Quantity = osku.ItemTotal,
                    Title = osku.Title,
                    SingleSkuAmount = (order.OrderCostDetailList.FirstOrDefault(ocd => ocd.SkuId == osku.Id)?.SkuAmount / osku.ItemTotal) ?? 0,
                    SingleSkuAmountStr = ((order.OrderCostDetailList.FirstOrDefault(ocd => ocd.SkuId == osku.Id)?.SkuAmount / osku.ItemTotal) ?? 0).ToString(),
                    OrderDropShippingId = osku.OrderDropShippingId
                }).ToList());
                relationPurchaseOrder.Closed += RelationPurchaseOrder_Closed;
                relationPurchaseOrder.ShowDialog();
            }
            else if (order.StorageType == StorageType.SD)
            {
                var sd = new SD(order.Id, false, order.VenderRemark, order.Flag, order.SDKey, order.SDPayChannel, order.SDPayBillNo, order.SDOperator, order.OrderCost.SDCommissionAmount, order.OrderCost.DeliveryExpressFreight, order.SDType ?? SDType.自刷);
                sd.Closed += Sd_Closed;
                sd.ShowDialog();
            }
            else
            {
                var calculationCostType = new ChooseCalculationCostType(order.Id, order.StorageType.Value, false);
                calculationCostType.Closed += ChooseCalculationCostType_Closed;
                calculationCostType.ShowDialog();
            }
        }

        private void ChooseCalculationCostType_Closed(object sender, EventArgs e)
        {
            var chooseCalculationCostType = sender as ChooseCalculationCostType;
            chooseCalculationCostType.Closed -= ChooseCalculationCostType_Closed;
            if (chooseCalculationCostType.DialogResult != true)
                return;

            var orderId = chooseCalculationCostType.OrderId;
            var storageType = chooseCalculationCostType.StorageType;
            var isSetStorageType = chooseCalculationCostType.IsSetStorageType;
            var isAutoCalculation = chooseCalculationCostType.IsAutoCalculation;

            if (isAutoCalculation)
            {
                IsLoading = true;
                Task.Factory.StartNew(() => orderService.AutoCalculationCost(orderId, isSetStorageType, storageType, globalContext.User.Shop.PlatformCommissionRatio ?? 0.05M)).ContinueWith(r =>
                   {
                       var response = r.Result;
                       if (!response.Success)
                       {
                           IsLoading = false;
                           App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "自动计算成本"));
                           return;
                       }

                       //LoadOrder(PageIndex); //自动计算成功刷新订单列表
                       RefreshOrder(orderId);
                   });
            }
            else
            {
                var order = OrderList.FirstOrDefault(o => o.Id == orderId);
                var orderSkuList = order.ItemList.Select(osku => new ManualEditCostOrderSku()
                {
                    Id = osku.Id,
                    ItemTotal = osku.ItemTotal,
                    Logo = osku.Logo,
                    Price = osku.Price,
                    Title = osku.Title,
                    ProductId = osku.ProductId,
                    ProductItemNum = osku.ProductItemNum
                }).ToList();
                foreach (var manualEditCostOrderSku in orderSkuList)
                {
                    var orderCostDetailList = order.OrderCostDetailGroupList?.FirstOrDefault(g => g.SkuId == manualEditCostOrderSku.Id)?.Items;
                    if (orderCostDetailList != null && orderCostDetailList.Count > 0)
                    {
                        manualEditCostOrderSku.ConsumableAmount = orderCostDetailList.Sum(ocd => ocd.ConsumableAmount);
                        manualEditCostOrderSku.DeliveryExpressFreight = orderCostDetailList.Sum(ocd => ocd.DeliveryExpressFreight);
                        manualEditCostOrderSku.FirstFreight = orderCostDetailList.Sum(ocd => ocd.FirstFreight);
                        manualEditCostOrderSku.OperationAmount = orderCostDetailList.Sum(ocd => ocd.OperationAmount);
                        manualEditCostOrderSku.PurchaseFreight = orderCostDetailList.Sum(ocd => ocd.PurchaseFreight);
                        manualEditCostOrderSku.SkuAmount = orderCostDetailList.Sum(ocd => ocd.SkuAmount);
                        manualEditCostOrderSku.StorageAmount = orderCostDetailList.Sum(ocd => ocd.StorageAmount);
                        manualEditCostOrderSku.TotalCost = orderCostDetailList.Sum(ocd => ocd.TotalCost);
                        manualEditCostOrderSku.UnitCost = orderCostDetailList.FirstOrDefault().UnitCost;
                    }
                    manualEditCostOrderSku.ConsumableAmountStr = manualEditCostOrderSku.ConsumableAmount.ToString();
                    manualEditCostOrderSku.DeliveryExpressFreightStr = manualEditCostOrderSku.DeliveryExpressFreight.ToString();
                    manualEditCostOrderSku.FirstFreightStr = manualEditCostOrderSku.FirstFreight.ToString();
                    manualEditCostOrderSku.OperationAmountStr = manualEditCostOrderSku.OperationAmount.ToString();
                    manualEditCostOrderSku.PurchaseFreightStr = manualEditCostOrderSku.PurchaseFreight.ToString();
                    manualEditCostOrderSku.SkuAmountStr = manualEditCostOrderSku.SkuAmount.ToString();
                    manualEditCostOrderSku.StorageAmountStr = manualEditCostOrderSku.StorageAmount.ToString();
                }

                var manualCalculationCost = new ManualCalculationCost(orderId, isSetStorageType, storageType, orderSkuList);
                manualCalculationCost.Closed += ManualCalculationCost_Closed;
                manualCalculationCost.ShowDialog();
            }
        }

        private void ManualCalculationCost_Closed(object sender, EventArgs e)
        {
            var manualCalculationCost = sender as ManualCalculationCost;
            manualCalculationCost.Closed -= ManualCalculationCost_Closed;
            if (manualCalculationCost.DialogResult != true)
                return;

            var orderId = manualCalculationCost.OrderId;
            var storageType = manualCalculationCost.StorageType;
            var isSetStorageType = manualCalculationCost.IsSetStorageType;
            var manualEditCostOrderSkuList = manualCalculationCost.ManualEditCostOrderSkuList;

            IsLoading = true;
            Task.Factory.StartNew(() => orderService.ManualCalculationCost(orderId,
                                                                           isSetStorageType,
                                                                           storageType,
                                                                           manualEditCostOrderSkuList,
                                                                           globalContext.User.Shop.PlatformCommissionRatio ?? 0.05M)).ContinueWith(r =>
               {
                   var response = r.Result;
                   if (!response.Success)
                   {
                       IsLoading = false;
                       App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "手动计算成本"));
                       return;
                   }
                   //LoadOrder(PageIndex); //手动计算成功刷新订单列表
                   RefreshOrder(orderId);
               });
        }

        private void OutStock(Order o)
        {
            var outStock = new OutStock(o.Id, globalContext.LogisticsResponseList);
            outStock.Closed += OutStock_Closed;
            outStock.ShowDialog();
        }

        private void OutStock_Closed(object sender, EventArgs e)
        {
            var outStock = sender as OutStock;
            if (outStock.DialogResult != true)
                return;
            var orderId = outStock.OrderId;
            var waybillNo = outStock.WaybillNo;
            var logistics = outStock.SelectedLogistics;
            var order = OrderList.FirstOrDefault(o => o.Id == orderId);
            IsLoading = true;
            Task.Factory.StartNew(() => orderService.OutStock(orderId, waybillNo, logistics.Id))
                        .ContinueWith(r =>
                        {
                            IsLoading = false;
                            var response = r.Result;
                            if (!response.Success)
                            {
                                App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "出库"));
                                return;
                            }
                            if (order != null)
                            {
                                order.OrderState = Models.OrderState.待收货;
                                order.WaybillNo = waybillNo;
                            }

                            //LoadOrder(PageIndex);
                        });
        }

        private void SyncOrder()
        {
            IsLoading = true;
            Task.Factory.StartNew(() => orderService.SyncOrder(globalContext.User.Shop.ShopId, StartDate, EndDate)).ContinueWith(r =>
            {
                IsLoading = false;
                var response = r.Result;
                if (response.Success)
                    App.Current.Dispatcher.Invoke(() => MessageBox.Show("同步任务创建成功,该任务会执行一段时间,请稍后查询订单列表观察同步结果", "同步订单"));
                else
                    App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "同步订单"));
            });
        }

        private void EditVenderRemark(Order order)
        {
            var editWindow = new EditVenderRemark(order.Id, order.VenderRemark, order.Flag);
            editWindow.Closed += EditVenderRemarkWindow_Closed;
            editWindow.ShowDialog();
        }

        private void EditVenderRemarkWindow_Closed(object sender, EventArgs e)
        {
            var editWindow = sender as EditVenderRemark;
            if (editWindow.DialogResult != true)
                return;

            var orderId = editWindow.OrderId;
            var order = OrderList.FirstOrDefault(o => o.Id == orderId);
            if (order == null)
                return;
            var venderRemark = editWindow.VenderRemark;
            var flag = editWindow.Flag;

            IsLoading = true;
            Task.Factory.StartNew(() => orderService.EditVenderRemark(orderId, venderRemark, flag)).ContinueWith(r =>
            {
                IsLoading = false;
                var response = r.Result;
                if (!response.Success)
                {
                    App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "修改商家备注"));
                    return;
                }

                order.VenderRemark = venderRemark;
                order.Flag = flag;
            });
        }

        private void Export()
        {
            var sfd = new SaveFileDialog() { Filter = "csv files(*.csv)|*.csv" };
            if (sfd.ShowDialog() != true)
                return;

            var ssaveFileName = sfd.FileName;
            IsLoading = true;
            Thread.Sleep(random.Next(500, 2000));
            Task.Factory.StartNew(() => orderService.ExportOrderList(SearchOrderId,
                                                     StartDate,
                                                     EndDate,
                                                     OrderState,
                                                     SearchSku,
                                                     SearchProductNo,
                                                     SearchWaybill,
                                                     SearchContactName,
                                                     pageIndex,
                                                     pageSize,
                                                     globalContext.User.Shop.ShopId,
                                                     OnlyDF,
                                                     ExcludeSD,
                                                     ExcludeCanceled)).ContinueWith(t =>
                                                     {
                                                         var r = t.Result;
                                                         if (!r.Success)
                                                         {
                                                             IsLoading = false;
                                                             App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "导出"));
                                                             return;
                                                         }

                                                         try
                                                         {
                                                             var list = r.Data.Select(x => x.ToString()).ToList();
                                                             list.Insert(0, "日期,店铺订单号,SKU编码,订单状态,仓储类型,代发下单单号,售价,商品成本,采购运费,头程费用,仓储服务费,快递费,平台扣点,补差金额,利润,利润率,收件人联系方式,售后类型,售后与特殊情况备注");
                                                             System.IO.File.WriteAllLines(ssaveFileName, list, Encoding.UTF8);
                                                             App.Current.Dispatcher.Invoke(() => MessageBox.Show("导出完成", "导出"));
                                                         }
                                                         catch (Exception ex)
                                                         {
                                                             App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "导出"));
                                                             return;
                                                         }
                                                         finally
                                                         {
                                                             IsLoading = false;
                                                         }
                                                     });
        }
    }
}