using BBWY.Client.APIServices;
using BBWY.Client.Models.APIModel.Response.PackTask;
using BBWY.Client.Models;
using BBWY.Client.Views.PackTask;
using BBWY.Common.Models;
using BBWY.Controls;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Linq;
using System.Windows.Controls;
using System.ComponentModel;
using HandyControl.Controls;
using System.Windows;
using System.Collections;
using NPOI.SS.Formula.Functions;
using GalaSoft.MvvmLight.Messaging;

namespace BBWY.Client.ViewModels.PackTask
{

    public partial class WareHouseListViewModel : BaseVM, IDenpendency//注入服务
    {

        #region 属性绑定
        /// <summary>
        /// 查询时间段
        /// </summary>
        private DateTime startTime;
        public DateTime StartTime { get => startTime; set { Set(ref startTime, value); } }

        private DateTime endTime;
        public DateTime EndTime { get => endTime; set { Set(ref endTime, value); } }




        

             private string searchShopName;
        public string SearchShopName
        {
            get => searchShopName; set
            {
                Set(ref searchShopName, value);
            }
        }

        /// <summary>
        /// 查询任务id
        /// </summary>
        private string searchTaskId;
        public string SearchTaskId
        {
            get => searchTaskId; set
            {
                Set(ref searchTaskId, value);
            }
        }

        /// <summary>
        /// 查询Sku
        /// </summary>
        private string searchSkuId;
        public string SearchSkuId { get => searchSkuId; set { Set(ref searchSkuId, value); } }

        public PackTaskState? taskState;
        /// <summary>
        /// 任务状态
        /// </summary>
        public PackTaskState? TaskState
        {
            get => taskState; private set
            {
                Set(ref taskState, value);
            }
        }

        private int pageIndex = 1;
        private int pageSize = 10;
        private int orderCount;//总数量

        private Visibility tipVisitity;
        /// <summary>
        /// 
        /// </summary>
        public Visibility TipVisitity { get => tipVisitity; set { Set(ref tipVisitity, value); } }

        /// <summary>
        /// 未到货数量
        /// </summary>
        public string NoArrivedCount { get => noArrivedCount; set { Set(ref noArrivedCount, value); } }
        private string noArrivedCount;
        private string someArrivedCount;
        /// <summary>
        /// 部分到货数量
        /// </summary>
        public string SomeArrivedCount { get => someArrivedCount; set { Set(ref someArrivedCount, value); } }
        private string worryCount;
        /// <summary>
        /// 加急数
        /// </summary>
        public string WorryCount { get => worryCount; set { Set(ref worryCount, value); } }


        private string arrivedCount;
        /// <summary>
        /// 已到货数量
        /// </summary>
        public string ArrivedCount { get => arrivedCount; set { Set(ref arrivedCount, value); } }




        private string waitPackCount;
        /// <summary>
        /// 待打包数
        /// </summary>
        public string WaitPackCount { get => waitPackCount; set { Set(ref waitPackCount, value); } }
        private string waitSealBox;
        /// <summary>
        /// 带封箱数
        /// </summary>
        public string WaitSealBox { get => waitSealBox; set { Set(ref waitSealBox, value); } }
        private string waitOutbound;
        /// <summary>
        /// 待出库数
        /// </summary>
        public string WaitOutbound { get => waitOutbound; set { Set(ref waitOutbound, value); } }


        //private int totalCount;
        ///// <summary>
        ///// 全部数量
        ///// </summary>
        //public int TotalCount { get => totalCount; set { Set(ref totalCount, 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); } }

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


        private int? IsWorry { get; set; }
        public int? taskStatus { get; set; }
        private ObservableCollection<PackTaskModel> packTaskList;
        /// <summary>
        /// 动态数据表
        /// </summary>
        public ObservableCollection<PackTaskModel> PackTaskList { get => packTaskList; set { Set(ref packTaskList, value); } }

        //private ObservableCollection<FeesItemTypeDTO> feesItems;
        ///// <summary>
        ///// 动态数据表
        ///// </summary>
        //public ObservableCollection<FeesItemTypeDTO> FeesItems { get => feesItems; set { Set(ref feesItems, value); } }


        public string searchDepartment;
        public string SearchDepartment
        {
            get => searchDepartment; set
            {
                Set(ref searchDepartment, value);

            }
        }


        #endregion
        private readonly ProductService productService;
        private readonly ConsumableService consumableService;
        private readonly WorkProcessService workProcessService;
        private readonly PackTaskService packTaskService;
        private readonly IncreateServiceService increateServiceService;
        public GlobalContext globalContext;
        public WareHouseListViewModel(PackTaskService packTaskService, ConsumableService consumableService, WorkProcessService workProcessService, IncreateServiceService increateServiceService, ProductService productService, BatchPurchaseService batchPurchaseService, GlobalContext globalContext)
        {
            this.globalContext = globalContext;


            this.packTaskService = packTaskService;
            this.consumableService = consumableService;

            //Messenger.Default.Send(globalContext, "AcceptGlobalContext");
            PackTaskList = new ObservableCollection<PackTaskModel>();//初始化数据

            SetTaskStateCommand = new RelayCommand<PackTaskState?>(SetTaskState);

            SearchTaskCommand = new RelayCommand(() =>
            {
                PageIndex = 1;
                Task.Factory.StartNew(() => SearchTaskList());  //手动点击查询订单
            });
            TaskPageIndexChangedCommand = new RelayCommand<PageArgs>(p =>
            {
                LoadIndex(p.PageIndex);
            });

            OpenSkuDetailCommand = new RelayCommand<object>(OpenSkuDetail);
            CopyTextCommand = new RelayCommand<object>(s =>
            {
                try
                {
                    Clipboard.SetText(s.ToString());
                }
                catch (Exception ex)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(ex);
                    Console.ResetColor();
                }
            });
            StartTime = DateTime.Now.Date;
            EndTime = DateTime.Now.Date;
            IsLoading = false;
            SetTaskStatusCommand = new RelayCommand<object>(SetTaskStatus);

            //加载数据
            SetTaskState(null);
            this.workProcessService = workProcessService;
            this.increateServiceService = increateServiceService;
            this.productService = productService;
            this.batchPurchaseService = batchPurchaseService;

            UpdateTaskStateCommand = new RelayCommand<object>(UpdateTaskState);


        }

        
        #region 事件绑定

        public ICommand SetTaskStatusCommand { get; set; }
        /// <summary>
        /// 打开图片链接
        /// </summary>
        public ICommand OpenSkuDetailCommand { get; set; }

        /// <summary>
        /// 复制
        /// </summary>
        public ICommand CopyTextCommand { get; set; }
        /// <summary>
        /// 筛选数据 
        /// </summary>
        public ICommand SetTaskStateCommand { get; set; }

        /// <summary>
        /// 修改任务状态
        /// </summary>
        public ICommand UpdateTaskStateCommand { get; set; }
        /// <summary>
        /// 搜索数据
        /// </summary>
        public ICommand SearchTaskCommand { get; set; }

        /// <summary>
        /// 创建任务
        /// </summary>
        public ICommand CreateTaskCommand { get; set; }

        /// <summary>
        /// 页面改变事件
        /// </summary>
        public ICommand TaskPageIndexChangedCommand { get; set; }


        BatchPurchaseService batchPurchaseService;

        private void UpdateTaskState(object obj)
        {
            var objList = (object[])obj;
            long taskId = (long)objList[0];
            var  packTaskState = (PackTaskState)objList[1];

            ApiResponse<object> res = null;
            switch (packTaskState)
            {
                case PackTaskState.未到货:
                    break;
                case PackTaskState.部分到货:
                    break;
                case PackTaskState.待质检:
                    break;
                case PackTaskState.待打包:
                    res= packTaskService.SetPackTaskState(taskId, PackTaskState.待封箱);
                    break;
                case PackTaskState.待封箱:
                    break;
                case PackTaskState.待出库:
                    break;
                case PackTaskState.已完成:
                    break;
                case PackTaskState.已取消:
                    break;
                default:
                    break;
            }
            if (res!=null&&res.Success)
            {
                SearchTaskList();
            }
            

        }
        public void SetTaskStatus(object obj)
        {
            var objList = (object[])obj;

            long taskId = (long)objList[0];

            string orderId = (string)objList[1];
            ///修改完成
            var model = packTaskService.UpdateTaskStatus(taskId, 1, orderId);
            if (model != null && model.Success)
                SearchTaskList();

        }
        public void SetTaskState(PackTaskState? taskState)
        {
            TaskState = taskState;
            SearchTaskList();

        }
        //public void SetTaskState(TaskState? taskState)
        //{
        //    IsWorry = null;
        //    TaskState = null;
        //    taskStatus = null;
        //    switch (taskState)
        //    {
        //        case null:
        //            break;
        //        case Models.TaskState.已到货:
        //        case Models.TaskState.部分到货: //未完成的数据
        //        case Models.TaskState.未到货:
        //            TaskState = taskState;
        //            taskStatus = 0;
        //            break;
        //        case Models.TaskState.全部: //所有数据

        //            break;
        //        case Models.TaskState.已完成:

        //            taskStatus = 1;
        //            break;
        //        case Models.TaskState.加急:
        //            taskStatus = 0;
        //            IsWorry = 1;
        //            break;
        //        default:
        //            break;
        //    }
        //    SearchTaskList();

        //}


        /// <summary>
        /// 搜索任务列表
        /// </summary>
        public void SearchTaskList()
        {
            try
            {
                if  (SearchTaskId != null && !string.IsNullOrEmpty(SearchTaskId.Trim()))
                    Convert.ToInt64(SearchTaskId);
            }
            catch
            {
                System.Windows.MessageBox.Show("任务id必须为数字");
                return;

            }

            //string shopId = null;
            //if (!string.IsNullOrEmpty(SearchShopName))
            //{
            //    var searchShop = globalContext.User.ShopList.FirstOrDefault(g => g.ShopName == SearchShopName);
            //    if (searchShop != null) shopId = searchShop.ShopId.ToString();
            //}



            IsLoading = true;
            Task.Factory.StartNew(() =>
            {
                PackTaskList = new ObservableCollection<PackTaskModel>();//初始化数据

                var datas = packTaskService.GetWareHouseList(IsWorry, SearchDepartment, SearchSkuId, SearchTaskId, StartTime, EndTime, (this.TaskState), SearchShopName,
                    PageIndex, PageSize);
                if (datas != null && datas.Data != null && datas.Success)
                {
                    var dataModel = datas.Data;
                    OrderCount = dataModel.TotalCount;
                    foreach (var item in dataModel.Items)
                    {
                        var data = new PackTaskModel()
                        {
                            AcceptName = item.UserName,
                            Availability = (TaskState)item.Availability,
                            BasicPack = (BasicPack)item.BasicPack,
                            DepartmentName = item.DepartmentName,
                            CertificatePosition = (CertificatePosition)item.CertificatePosition,

                            GoodsNumber = item.GoodsNumber,
                            Increment1 = item.Increment1,
                            ItemList = new List<SkuMessage>() { new SkuMessage
                            {    BrandName = item.BrandName,
                                 GoodsNo = item.ProductItemNum, Logo= item.Logo,
                                 ShopName = item.ShopName, SkuName = item.SkuName,
                                 Id = item.SkuId

                            } },
                            MarkMessage = item.MarkMessage,
                            PackType = (PackType)item.PackType,
                            TaskState = item.TaskState,
                            PositionType = item.PositionType,
                            SkuCount = item.SkuCount,
                            SkuTitle = item.SkuGoodsTitle,
                            TaskId = item.TaskId,
                            EndTime = item.CreateTime,
                            OrderId = item.OrderId,
                            SkuId = item.SkuId,
                            SkuName = item.SkuName,

                        };
                        if (item.BarCodeDTO != null && item.BarCodeDTO.Id > 0)
                        {

                            data.BarCodeModel = item.BarCodeDTO;

                        }
                        if (item.Cers != null)
                        {
                            data.CertificateModel = item.Cers;

                        }

                        data.ReflashTask = ReflashTask;

                        if (item.FeesItemResponse != null)
                        {
                            data.FeesItemResponse = item.FeesItemResponse;
                            data.FeesMoney = item.FeesItemResponse.SingleFees;

                            data.FeesItemResponse.DiscountAllFees = item.FeesItemResponse.AllFees *
                            item.FeesItemResponse.disCount;
                            data.IsShowFees = data.FeesMoney > 0 ? true : false;

                        }
                        else
                        {
                            data.IsShowFees = false;
                        }

                        if (item.PackUserName != null && item.PackUserName.Count() > 0)
                        {
                            data.PackUser = string.Join("\r\n", item.PackUserName);
                        }

                        App.Current.Dispatcher.BeginInvoke(new Action(() =>
                        {
                            PackTaskList.Add(data);
                        }));

                    }
                }
                else
                {
                    //App.Current.Dispatcher.BeginInvoke(new Action(() =>
                    //{
                    //    new TipsWindow("查不到数据").Show();
                    //}));
                }
                IsLoadCount();
                IsLoading = false;
            });
        }

        private void IsLoadCount()
        {
            var packTaskResult = packTaskService.GetWareAllCount();
            if (packTaskResult != null && packTaskResult.Success)
            {
                App.Current.Dispatcher.Invoke(() =>
                {
                    ArrivedCount = packTaskResult.Data.ArrivedCount.ToString();
                    NoArrivedCount = packTaskResult.Data.NoArrivedCount.ToString();
                    SomeArrivedCount = packTaskResult.Data.SomeArrivedCount.ToString();
                    WorryCount = packTaskResult.Data.WorryCount.ToString();
                    WaitOutbound = packTaskResult.Data.WaitOutbound?.ToString();
                    WaitPackCount = packTaskResult.Data.WaitPackCount?.ToString();
                    WaitSealBox = packTaskResult.Data.WaitSealBox?.ToString();
                });
            }
        }
        private void LoadIndex(int pageIndex)
        {
            PageIndex = pageIndex;//
            SearchTaskList();
        }
        public void ReflashTask()//刷新界面
        {
            SearchTaskList();
        }


        private void OpenSkuDetail(object param)
        {
            var paramList = (object[])param;
            var skuId = paramList[1].ToString();
            var url = $"https://item.jd.com/{skuId}.html";
            try
            {
                System.Diagnostics.Process.Start("explorer.exe", url);
            }
            catch (Exception ex)
            {
                Clipboard.SetText(url);
                System.Windows.MessageBox.Show($"{ex.Message}\r\n调用浏览器失败,网页链接已复制到剪切板,请手动打开浏览器访问", "提示");
            }
        }


        #endregion

    }
}