using BBWY.Client.Helpers;
using BBWY.Client.Models;
using BBWY.Client.Models.APIModel;
using BBWY.Client.Models.APIModel.Request;
using BBWY.Client.Models.APIModel.Response.PackTask;
using BBWY.Client.Models.PackTask;
using BBWY.Common.Http;
using BBWY.Common.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Runtime.Serialization;
using System.Threading.Tasks;
using System.Windows.Documents;

namespace BBWY.Client.APIServices
{
    public class PackTaskService : BaseApiService, IDenpendency
    {



        public PackTaskService(RestApiService restApiService, GlobalContext globalContext) : base(restApiService, globalContext)
        {
        }

   

        public ApiResponse<SearchTaskListResponse> GetTaskList(string skuId = null, string taskId = null,
                                              
                                                   TaskState? TaskState = null,
                                                   int pageIndex = 1,
                                                   int pageSize = 10

                                                  )
        {

            if (taskId != null && !string.IsNullOrEmpty(taskId.Trim()))
            {
                return SendRequest<SearchTaskListResponse>(globalContext.QKApiHost, "api/PackTask/SearchTaskList", new
                {
                    TaskId = taskId,
                    ShopId = globalContext.User.Shop.ShopId.ToString()

                }, null, HttpMethod.Post);
            }
            return SendRequest<SearchTaskListResponse>(globalContext.QKApiHost, "api/PackTask/SearchTaskList", new
            {

                SkuId = skuId,
                TaskId = taskId,
                TaskState = TaskState,
                PageIndex = pageIndex,
                PageSize = pageSize,
                ShopId = globalContext.User.Shop.ShopId.ToString()
            }, null, HttpMethod.Post);
        }
        public ApiResponse<SearchTaskListResponse> GetWareHouseList(string WayBillNo = null, string SourceExpressName = null,  string departmentName = null, string skuId = null, string taskId = null,

                                                   TaskState? TaskState = null,
                                                   string ShopName = null,
                                                   int pageIndex = 1,
                                                   int pageSize = 10
                                                  )
        {
            if (taskId != null && !string.IsNullOrEmpty(taskId.Trim()))
            {
                return SendRequest<SearchTaskListResponse>(globalContext.QKApiHost, "api/PackTask/SearchTaskList", new
                {
                    TaskId = taskId

                }, null, HttpMethod.Post);
            }
            return SendRequest<SearchTaskListResponse>(globalContext.QKApiHost, "api/PackTask/SearchTaskList", new
            {
                DepartmentName = departmentName,
                SkuId = skuId,
                TaskId = taskId,
                TaskState = TaskState,
                PageIndex = pageIndex,
                PageSize = pageSize,
                ShopName = ShopName,
                WayBillNo = WayBillNo,
                SourceExpressName = SourceExpressName,
            }, null, HttpMethod.Post);
        }



        public ApiResponse<ProductSkuCountsResponse> GetTaskAllCount(string shopId = null)
        {
            return SendRequest<ProductSkuCountsResponse>(globalContext.QKApiHost, $"api/PackTask/GetProductSkuCount?shopId={shopId}",
                null
                , null, HttpMethod.Get);
        }


        public ApiResponse<ProductSkuResponse> GetProductSku(string skuId)
        {
            HttpClientHelper helper = new HttpClientHelper(globalContext.QKApiHost);

            string url = $"{globalContext.QKApiHost}/api/PackTask/SearchProduct?skuId={skuId}&ShopId={globalContext.User.Shop.ShopId}";
            var data = helper.Get(url);

            return JsonConvert.DeserializeObject<ApiResponse<ProductSkuResponse>>(data);
        }
        public ApiResponse<CertificateModel> GetSpuCer(string spuId)
        {
            HttpClientHelper helper = new HttpClientHelper(globalContext.QKApiHost);

            string url = $"{globalContext.QKApiHost}/api/PackTask/GetSpuCer?spuId={spuId}";
            var data = helper.Get(url);

            return JsonConvert.DeserializeObject<ApiResponse<CertificateModel>>(data);
        }

        public ApiResponse<object> UpdateTask(CreateTaskRequest createTaskRequest)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/UpdatePackTask",
               createTaskRequest
            , null, HttpMethod.Post);
        }


        public ApiResponse<object> DeletedTask(long taskId)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/DeletedPackTask",
               new
               {
                   TaskId = taskId,
                   UserId = globalContext.User.Id.ToString()
               }
            , null, HttpMethod.Post);
        }


        public ApiResponse<object> CreateTask(CreateTaskRequest createTaskRequest)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/CreatePackTask",
               createTaskRequest
            , null, HttpMethod.Post);
        }




        /// <summary>
        /// 修改任务状态
        /// </summary>
        /// <param name="taskId"></param>
        /// <param name="packTaskState"></param>
        /// <returns></returns>
        public ApiResponse<object> SetPackTaskState(long taskId, TaskState taskState)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/SetPackTaskState", new
            {
                taskId = taskId,
                TaskState = taskState
            }
          , null, HttpMethod.Post);
        }

        

        public ApiResponse<long> SaveBarCode(BarCodeRequest barCodeModel)
        {
            return SendRequest<long>(globalContext.QKApiHost, "api/PackTask/CommitBarCode", barCodeModel
          , null, HttpMethod.Post);
        }

        public ApiResponse<long> SaveCer(CerRequest cerRequest)
        {
            return SendRequest<long>(globalContext.QKApiHost, "api/PackTask/CommitCer", cerRequest
          , null, HttpMethod.Post);
        }
        public ApiResponse<long> SaveSpuCer(CerRequest cerRequest)
        {
            return SendRequest<long>(globalContext.QKApiHost, "api/PackTask/CommitSpuCer", cerRequest
          , null, HttpMethod.Post);
        }


        /// <summary>
        /// 获取打包人员列表
        /// </summary>
        /// <returns></returns>
        public ApiResponse<PackUser[]> GetPackMembers()
        {

            return SendRequest<PackUser[]>(globalContext.QKApiHost, "api/PackTask/SearchPackMembers", null
         , null, HttpMethod.Get);

        }

        public ApiResponse<ShopTotalResponse> ShopTotal(string skuId = null, string taskId = null,
                                                  DateTime? startTime = null,
                                                  DateTime? endTime = null,
                                                  string ShopName = null,
                                                  string DepartmentName = null,
                                                  int pageIndex = 1,
                                                  int pageSize = 10
                                                 )
        {
            return SendRequest<ShopTotalResponse>(globalContext.QKApiHost, "api/PackTask/ShopTotal", new
            {

                SkuId = skuId,
                TaskId = taskId,
                StartTime = startTime,
                EndTime = endTime,
                DepartmentName,
                ShopName,
                PageIndex = pageIndex,
                PageSize = pageSize

            }, null, HttpMethod.Post);
        }
        /// <summary>
        /// 批量结算
        /// </summary>
        /// <param name="taskIds"></param>
        /// <returns></returns>
        public ApiResponse<object> BatchSettle(params long[] taskIds)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/BatchSettle", new
            {
                taskIds = taskIds,
                userId = globalContext.User.Id.ToString(),

            }, null, HttpMethod.Post);
        }
        /// <summary>
        /// 取消拳探任务
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        public ApiResponse<object> CancelQTTask(string orderId)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/CancelQTTask", new
            {
                orderId,
                userId = globalContext.User.Id.ToString(),
            }, null, HttpMethod.Post);
        }

        /// <summary>
        /// 统计打包人员工资明细
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        public ApiResponse<TotalPackUserSalaryResponse> TotalPackUserSalary(string PackUserName = null, DateTime? StartTime = null, DateTime? EndTime = null, int PageIndex = 1
            , int PageSize = 10)
        {
            return SendRequest<TotalPackUserSalaryResponse>(globalContext.QKApiHost, "api/PackTask/TotalPackUserSalary", new
            {
                PackUserName,
                StartTime,
                EndTime,
                PageIndex,
                PageSize
            }, null, HttpMethod.Post);
        }

        public ApiResponse<bool> StoreGetBySelf(long taskId)
        {

            return SendRequest<bool>(globalContext.QKApiHost, $"api/PackTask/StoreGetBySelf?TaskId={taskId}", null, null, HttpMethod.Post);
        }

        public ApiResponse<bool> CompletedPackTask(long taskId)
        {
            return SendRequest<bool>(globalContext.QKApiHost, $"api/PackTask/CompletedPackTask?taskId={taskId}", null, null, HttpMethod.Post);
        }

        /// <summary>
        /// 获取B端物流信息
        /// </summary>
        /// <param name="orderId"></param>
        /// <param name="sourceSkuId"></param>
        /// <returns></returns>
        public ApiResponse<List< ExpressOrderResponse>> GetPurchaseExpressOrderList(string orderId,string sourceSkuId)
        {
            return SendRequest<List<ExpressOrderResponse>>("http://bbwyb.qiyue666.com", $"Api/Order/GetPurchaseExpressOrderList", new {
                orderId,
                sourceSkuId
            }, null, HttpMethod.Post);
        }


        /// <summary>
        /// 查询超时任务列表
        /// </summary>
        /// <param name="taskId"></param>
        /// <returns></returns>
        public ApiResponse<SearchOverTimeTaskResponse> SearchOverTimeTaskList(string ShopId, DateTime? StartTime, DateTime? EndTime, OverTimeTaskType? OverTimeTaskType, int? PageIndex, int? PageSize=20)
        {
            return SendRequest<SearchOverTimeTaskResponse>(globalContext.QKApiHost, $"api/PackTask/SearchOverTimeTaskList", new {
                ShopId,
                StartTime,
                EndTime,
                OverTimeTaskType,
                PageIndex,
                PageSize
            }, null, HttpMethod.Post);
        }

    }

    public class CompeteSealBox
    {
        /// <summary>
        /// 任务Id
        /// </summary>
        public long[] TaskId { get; set; }
        /// <summary>
        /// 仓库Id
        /// </summary>
        public string WareId { get; set; }

        public int BoxCount { get; set; }

    }


    public class AddConsumableRequest
    {
        public long TaskId { get; set; }
        public long[] ConsumableIds { get; set; }
    }



    public class PackTaskDetailRequest
    {      /// <summary>
           /// 任务id
           /// </summary>
        public long TaskId { get; set; }
        /// <summary>
        /// 定向收费
        /// </summary>
        public decimal? DirectionalFees { get; set; }

        /// <summary>
        /// 增量配件任务数量
        /// </summary>
        public int IncrementPartTaskCount { get; set; }
        /// <summary>
        /// 增量配件数量
        /// </summary>
        public int IncrementPartCount { get; set; }


        /// <summary>
        /// 增值服务数据
        /// </summary>
        public List<PackItemModel> IncreateList { get; set; }

        /// <summary>
        /// 耗材服务数据
        /// </summary>
        public List<PackItemModel> ConsumableList { get; set; }

        /// <summary>
        ///工序服务数据
        /// </summary>
        public List<PackItemModel> IncrementProcessList { get; set; }
        /// <summary>
        /// 基础包装工序(基础包装工序)
        /// </summary>
        public List<PackItemModel> BasicPackProcessList { get; set; }
    }
    /// <summary>
    /// 上传服务
    /// </summary>
    public class UploadServiceRequest
    {

        /// <summary>
        /// 折扣
        /// </summary>
        public decimal Discount { get; set; } = 1;

        /// <summary>
        /// 任务id
        /// </summary>
        public long TaskId { get; set; }
        /// <summary>
        /// 耗材ids
        /// </summary>
        public string ConsumableIds { get; set; }
        /// <summary>
        /// 耗材数量
        /// </summary>
        public string ConsumableNos { get; set; }
        /// <summary>
        /// 工序ids
        /// </summary>
        public string WorkProcessIds { get; set; }
        /// <summary>
        /// 工序数量
        /// </summary>
        public string WorkProcessNos { get; set; }
        /// <summary>
        /// 增值服务ids
        /// </summary>
        public string IncreateServiceIds { get; set; }
        /// <summary>
        /// 增值服务数量
        /// </summary>
        public string IncreateServiceNos { get; set; }

        public string PackServiceIds { get; set; }
        public string PackServiceNos { get; set; }
        /// <summary>
        /// 任务单件费用
        /// </summary>
        public decimal SingleFees { get; set; }
        /// <summary>
        /// 任务总费用
        /// </summary>
        public decimal AllFees { get; set; }

        /// <summary>
        /// 增加数据
        /// </summary>
        public List<PersonTaskModel> AddPackServices { get; set; }
        /// <summary>
        /// 删除的数据
        /// </summary>
        public List<long> DeletedPackServices { get; set; }

        public List<PersonTaskModel> DelPackServices { get; set; }

        //public PersonTaskModel[] PersonTaskModels { get; set; }

        //public IncreateMemberModel[] IncreateMembers { get; set; }

        //public ProcessMemberModel[] ProcessMembers { get; set; }

        public decimal? IncreaseFees { get; set; }

        public decimal? PackFees { get; set; }

        public decimal? ConsumableFees { get; set; }

        public decimal? DiscountPrice { get; set; }

        public string OrderId { get; set; }

        public string SkuId { get; set; }
    }

    public class PersonTaskModel
    {
        /// <summary>
        /// 任务id
        /// </summary>
        public long TaskId { get; set; }

        /// <summary>
        /// 打包人
        /// </summary>
        public string PackUserId { get; set; }

        /// <summary>
        /// 服务id
        /// </summary>
        public long? ServiceId { get; set; }
        /// <summary>
        /// 服务数量
        /// </summary>
        public int? ServiceCount { get; set; }
        ///// <summary>
        ///// 增值服务ids
        ///// </summary>
        //public string IncreateServiceIds { get; set; }
        ///// <summary>
        ///// 增值服务数量
        ///// </summary>
        //public string IncreateServiceNos { get; set; }
        ///// <summary>
        ///// 工序ids
        ///// </summary>
        //public string WorkProcessIds { get; set; }
        ///// <summary>
        ///// 工序数量
        ///// </summary>
        //public string WorkProcessNos { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public bool IsDeleted { get; set; }
        /// <summary>
        /// 折扣
        /// </summary>
        public decimal Discount { get; set; } = 1;
        /// <summary>
        /// 总费用
        /// </summary>
        public decimal AllFees { get; set; }
        /// <summary>
        /// 时间
        /// </summary>
        public DateTime CreateTime { get; set; } = DateTime.Now;

        public ServiceType ServiceType { get; set; }
    }



    public class ConsumableTaskModel
    {
        public decimal Price { get; set; }
        /// <summary>
        /// 耗材服务id
        /// </summary>
        public long? ConsumableId { get; set; }
        /// <summary>
        /// 耗材服务数量
        /// </summary>
        public int? ConsumableCount { get; set; }
    }


    public class PackServiceMemberModel
    {
        public decimal Price { get; set; }

        public string UserId { get; set; }
        /// <summary>
        /// 增值服务Id
        /// </summary>
        public long? PackServiceId { get; set; }
        /// <summary>
        /// 数量
        /// </summary>
        public int PackServiceCount { get; set; }

        public ServiceType ServiceType { get; set; }
    }





}