using BBWY.Client.APIServices;
using BBWY.Client.Models.PackTask;
using BBWY.Common.Models;
using BBWY.Controls;
using GalaSoft.MvvmLight.Command;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows;
using System.Linq;
using AutoMapper.Internal;
using WebSocketSharp;

namespace BBWY.Client.ViewModels.TotalPackTask
{
 
    public class ShopPackTaskTotalViewModel : BaseVM, IDenpendency
    {
        private readonly PackTaskService packTaskService;
        private bool isLoading;
        private DateTime startDate;
        private DateTime endDate;
        private int pageIndex = 1;
        private int pageSize = 15;
        private int orderCount;
        private string searchTaskId;

        private string searchSkuId;
        private ObservableCollection<ShopTotal> packTaskTotalList;
 
        public ObservableCollection<ShopTotal> PackTaskTotalList { get => packTaskTotalList; set { Set(ref packTaskTotalList, value); } }
        public string SearchSkuId { get => searchSkuId; set { Set(ref searchSkuId, value); } }

        public string SearchTaskId { get => searchTaskId; set { Set(ref searchTaskId, value); } }

        public bool IsLoading { get => isLoading; set { Set(ref isLoading, 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); } }

        private decimal totalPackDiscountFees;
        /// <summary>
        /// 总打包费用
        /// </summary>
        public decimal TotalPackDiscountFees { get => totalPackDiscountFees; set { Set(ref totalPackDiscountFees, value); } }

        private decimal totalConsumableFees;
        /// <summary>
        /// 总耗材费
        /// </summary>
        public decimal TotalConsumableFees { get => totalConsumableFees; set { Set(ref totalConsumableFees, value); } }

        private decimal totalFees;
        /// <summary>
        /// 总耗材费
        /// </summary>
        public decimal TotalFees { get => totalFees; set { Set(ref totalFees, value); } }


        public ICommand SetSearchDateCommand { get; set; }

        public ICommand SearchTaskTotalCommand { get; set; }

        public ICommand ExportCommand { get; set; }

        public ICommand OrderPageIndexChangedCommand { get; set; }



        //public IList<Department> departmentList;
        //ShopService shopService;
        public ShopPackTaskTotalViewModel(PackTaskService packTaskService, GlobalContext globalContext)
        {
            this.packTaskService = packTaskService;
            SearchTaskTotalCommand = new RelayCommand(() =>
            {
                SearchTask(1);
            });

            StartDate = DateTime.Now;
            EndDate = DateTime.Now;

            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));  //点击日期查询订单
            });

            OrderPageIndexChangedCommand = new RelayCommand<PageArgs>(p =>
            {
                LoadOrder(p.PageIndex);
            });

            ExportCommand = new RelayCommand(Export);

            SearchTaskTotal();
            this.globalContext = globalContext;
        }


        GlobalContext globalContext;
        private void Export()
        {

            SaveFileDialog save = new SaveFileDialog();
            save.Filter = "csv files(*.csv)|*.csv";
            var result = save.ShowDialog();
            if (result == null || !result.Value)
            {
                return;
            }

            string fileName = save.FileName;

            Task.Factory.StartNew(() =>
            {
                IsLoading = true;
                var res = packTaskService.ShopTotalV2(SearchSkuId, SearchTaskId, globalContext.User.Shop.ShopId.ToString(), StartDate, EndDate, null,
                    null, 0, 0);//获取全部数据
                if (res.Success)
                {
                    //string title = "任务ID,日期,是否结清,部门,店铺,对接人,sku名称,sku数量,增值服务,打包服务,耗材服务,原价,促销折扣,结算价格,对接备注";
                    string title = "任务ID,日期,是否结清,所属部门,所属店铺,包装数量,收货数量,耗材总价,工序类型,工序套餐,工序单价,包装原价,包装折扣系数,包装折扣价,总收费";
                    var excelList = res.Data.ShopTotals.Select(x => x.ToString()).ToList();
                    excelList.Insert(0, title);
                    System.IO.File.WriteAllLines(fileName, excelList, Encoding.UTF8);
                }
                IsLoading = false;

            });

        }

      

        private void SearchTaskTotal()
        {

            PackTaskTotalList = new ObservableCollection<ShopTotal>();
            Task.Factory.StartNew(() =>
            {
                IsLoading = true;
                var res = packTaskService.ShopTotalV2(SearchSkuId, SearchTaskId,  globalContext.User.Shop.ShopId.ToString(), StartDate, EndDate, null,
                     null, PageIndex, PageSize);
                if (res != null && res.Success)
                {
                    OrderCount = res.Data.TotalCount;
                    TotalConsumableFees = res.Data.TotalConsumableFees;
                    TotalPackDiscountFees = res.Data.TotalPackDiscountFees;
                    TotalFees = TotalConsumableFees + TotalPackDiscountFees;
                    foreach (var shopTotal in res.Data.ShopTotals)
                    {
                        if (!shopTotal.ProcessComboName.IsNullOrEmpty())
                            shopTotal.FeesItemResponse = new Models.APIModel.Response.PackTask.FeesItemResponse
                            {
                                AllFees = shopTotal.AllFees.Value,
                                PackFees = shopTotal.PackDisCountFees.Value,
                                TaskId = shopTotal.TaskId,
                                ProcessTypeName = shopTotal.ProcessTypeName,
                                ProcessComboName = shopTotal.ProcessComboName,
                                ConsumableFees = shopTotal.ConsumableFees,
                                ConsumableList = shopTotal.ConsumableList,
                                ProcessComboPrice = shopTotal.ProcessComboPrice,
                                ProcessComboTaskCount = shopTotal.ProcessComboTaskCount,
                                DiscountFoctor = shopTotal.DiscountFactor
                            };

                        App.Current.Dispatcher.Invoke(() =>
                        {
                            PackTaskTotalList.Add(shopTotal);
                        });
                    }
                    
                }

                IsLoading = false;
            });


        }

        private void LoadOrder(int pageIndex)
        {
            SearchTask(pageIndex);
        }

        private void SearchTask(int pageIndex)
        {
            PageIndex = pageIndex;
            SearchTaskTotal();
        }
    }
}