using BBWY.Client.APIServices;
using BBWY.Client.Models;
using BBWY.Client.ViewModels;
using BBWY.Client.Views.BatchPurchase;
using BBWY.Common.Extensions;
using BBWY.Common.Models;
using BBWY.Controls;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
using System.Windows.Input;

namespace BBWY.Client.ViewModels
{
    public class BatchPurchaseOrderListViewModel : BaseVM, IDenpendency
    {
        private PackTaskService packTaskService;
        private BatchPurchaseService batchPurchaseService;
        private GlobalContext globalContext;
        private DateTime startDate;
        private DateTime endDate;
        private string searchPurchaseOrderId;
        private string searchPurchaseName;
        private string searchProductId;
        private string searchSkuId;
        private PurchaseOrderState? purchaseOrderState;
        private int pageIndex;
        private int pageSize;
        private bool isLoading;
        private long totalCount;

        public ICommand SearchPurchaseOrderCommand { get; set; }
        public ICommand OpenCreateNewPurchaseOrderDialogCommand { get; set; }

        public ICommand SetSearchDateCommand { get; set; }

        public ICommand SetPurchaseOrderStateCommand { get; set; }

        public ICommand OnPageIndexChangedCommand { get; set; }

        public ICommand PayPurchaseOrderCommand { get; set; }

        public ICommand CancelPurchaseOrderCommand { get; set; }

        public ICommand CreateQTTaskCommand { get; set; }
        public ICommand CancelQTTaskCommand { get; set; }

        public DateTime StartDate { get => startDate; set { Set(ref startDate, value); } }
        public DateTime EndDate { get => endDate; set { Set(ref endDate, value); } }
        public string SearchPurchaseOrderId { get => searchPurchaseOrderId; set { Set(ref searchPurchaseOrderId, value); } }
        public string SearchPurchaseName { get => searchPurchaseName; set { Set(ref searchPurchaseName, value); } }
        public string SearchProductId { get => searchProductId; set { Set(ref searchProductId, value); } }
        public string SearchSkuId { get => searchSkuId; set { Set(ref searchSkuId, value); } }
        public PurchaseOrderState? PurchaseOrderState { get => purchaseOrderState; set { Set(ref purchaseOrderState, value); } }
        public int PageIndex { get => pageIndex; set { Set(ref pageIndex, value); } }

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

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

        public long TotalCount { get => totalCount; set { Set(ref totalCount, value); } }

        public IList<PurchaseOrderV2> PurchaseOrderList { get; set; }

        public BatchPurchaseOrderListViewModel(GlobalContext globalContext, BatchPurchaseService batchPurchaseService, PackTaskService packTaskService)
        {
            this.batchPurchaseService = batchPurchaseService;
            SetSearchDateCommand = new RelayCommand<int>(SetSearchDate);
            SetPurchaseOrderStateCommand = new RelayCommand<PurchaseOrderState?>(SetPurchaseOrderState);
            SearchPurchaseOrderCommand = new RelayCommand(InitQueryPurchaseOrder);
            OpenCreateNewPurchaseOrderDialogCommand = new RelayCommand(OpenCreateNewPurchaseOrderDialog);
            OnPageIndexChangedCommand = new RelayCommand<PageArgs>(OnPageIndexChanged);

            PayPurchaseOrderCommand = new RelayCommand<object>(PayPurchaseOrder);
            CancelPurchaseOrderCommand = new RelayCommand<object>(CancelPurchaseOrder);

            CreateQTTaskCommand = new RelayCommand<object>(CreateQTTask);
            CancelQTTaskCommand = new RelayCommand<object>(CancelQTTask);
            PageSize = 10;
            this.globalContext = globalContext;
            EndDate = DateTime.Now.Date;
            StartDate = DateTime.Now.Date.AddDays(-15);
            PurchaseOrderList = new ObservableCollection<PurchaseOrderV2>();
            InitQueryPurchaseOrder();
            this.packTaskService = packTaskService;
        }

        private void CancelQTTask(object obj)
        {
            MessageBoxResult result = MessageBox.Show("确定取消订单任务?", "提示",
                                            MessageBoxButton.YesNo,
                                            MessageBoxImage.Warning);
            if (result != MessageBoxResult.Yes) return;
            var parameters = (object[])obj;
            var id = parameters[0].ToString();//订单id
            //取消打包任务

            var res = packTaskService.CancelQTTask(id);
            if (res.Success)
            {
                var resPackState = batchPurchaseService.UpdatePackState(id, Models.PackState.待发布);
                if (resPackState.Success)
                    Task.Factory.StartNew(() => QueryPurchaseOrder(PageIndex));
            }

        }

        private void CreateQTTask(object obj)
        {
            var parameters = (object[])obj;
            var PurchasePlatform = (Platform)parameters[0];//采购平台
            var id   = parameters[1].ToString();//订单id
            var itemList = (List<PurchaseOrderSku>)parameters[2];//skuid  数量
            var PurchaserId = (string)parameters[3];//采购商id


            ViewModelLocator viewModelLocator = new ViewModelLocator();
            BatchPublishTaskViewModel batch = viewModelLocator.BatchPublishTask;
          


            batch.PublishTask = () => {
                //修改 打包状态
               var res = batchPurchaseService.UpdatePackState(id,  Models.PackState.打包中);
                if (res.Success)
                    Task.Factory.StartNew(() => QueryPurchaseOrder(PageIndex));

            };
            batch.AddSkus(PurchasePlatform, id, PurchaserId, itemList);
            BatchPublishTaskWindow window = new BatchPublishTaskWindow();
            window.Show();
        }

        private void CancelPurchaseOrder(object obj)
        {
            MessageBoxResult result = MessageBox.Show("确定取消订单?", "提示",
                                            MessageBoxButton.YesNo,
                                            MessageBoxImage.Warning);
            if (result != MessageBoxResult.Yes) return;
            //;
            var parameters = (object[])obj;

            var PurchasePlatform = (Platform)parameters[0];//采购平台


            var purchaseAccount = globalContext.User.Shop.PurchaseAccountList.FirstOrDefault(p => p.PurchasePlatformId == PurchasePlatform);

            var res = batchPurchaseService.CancelOrder(parameters[1].ToString(), purchaseAccount, "");
            if (res.Success)
            {
                if (res.Data.Success)
                {
                    Task.Factory.StartNew(() => QueryPurchaseOrder(PageIndex));
                    return;
                }

                MessageBox.Show(res.Data.Msg);
                return;
            }
            if (res.Data != null)
                MessageBox.Show(res.Data.Msg);
            else
                MessageBox.Show(res.Msg);
        }

        private void PayPurchaseOrder(object obj)
        {

            MessageBoxResult result = MessageBox.Show("确定支付货款?", "提示",
                                             MessageBoxButton.YesNo,
                                             MessageBoxImage.Warning);
            if (result != MessageBoxResult.Yes) return;

            var parameters = (object[])obj;
            var PurchasePlatform = (Platform)parameters[0];//采购平台
            var purchaseAccount = globalContext.User.Shop.PurchaseAccountList.FirstOrDefault(p => p.PurchasePlatformId == PurchasePlatform);
            var res = batchPurchaseService.PayOrder(parameters[1].ToString(), PurchasePlatform, purchaseAccount);
            if (res.Success)
            {
                if (res.Data.Success)
                {
                    Task.Factory.StartNew(() => QueryPurchaseOrder(PageIndex));
                    return;
                }
                MessageBox.Show(res.Data.Msg);
                return;
            }
            if (res.Data != null)
                MessageBox.Show(res.Data.Msg);
            else
                MessageBox.Show(res.Msg);


        }

        private void InitQueryPurchaseOrder()
        {
            PageIndex = 1;
            Task.Factory.StartNew(() => QueryPurchaseOrder(PageIndex));
        }

        private void SetPurchaseOrderState(PurchaseOrderState? purchaseOrderState)
        {
            this.PurchaseOrderState = purchaseOrderState;
            InitQueryPurchaseOrder();
        }

        private void SetSearchDate(int d)
        {
            EndDate = d == 1 ? DateTime.Now.Date.AddDays(-1) : DateTime.Now;
            StartDate = DateTime.Now.Date.AddDays(d * -1);
            InitQueryPurchaseOrder();
        }

        private void QueryPurchaseOrder(int pageIndex)
        {
            IsLoading = true;
            var response = batchPurchaseService.GetPurchaseOrderList(SearchProductId,
                                                                     SearchSkuId,
                                                                     SearchPurchaseName,
                                                                     SearchPurchaseOrderId,
                                                                     pageIndex,
                                                                     PageSize,
                                                                     StartDate,
                                                                     EndDate,
                                                                     this.PurchaseOrderState);
            IsLoading = false;
            if (!response.Success)
            {
                App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "提示"));
                return;
            }

            TotalCount = response.Data.Count;
            App.Current.Dispatcher.Invoke(() => PurchaseOrderList.Clear());

            if (response.Data.ItemList == null || response.Data.ItemList.Count() == 0)
                return;

            var list = response.Data.ItemList.Map<IList<PurchaseOrderV2>>();

            App.Current.Dispatcher.Invoke(() =>
            {
                foreach (var p in list)
                    PurchaseOrderList.Add(p);
            });
        }

        private void OpenCreateNewPurchaseOrderDialog()
        {
            var createWindow = new BatchCreateNewPurchaseOrder();
            if (createWindow.ShowDialog() == true)
            {
                InitQueryPurchaseOrder(); //刷新采购单页面
            }
        }

        private void OnPageIndexChanged(PageArgs pageArgs)
        {
            Task.Factory.StartNew(() => QueryPurchaseOrder(pageArgs.PageIndex));
        }
    }
}