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.Windows.Documents;

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



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



        public ApiResponse<PackTaskResultResponse> GetOrderList(string skuId = null, string taskId = null,
                                                   DateTime? startTime = null,
                                                   DateTime? endTime = null,
                                                   TaskState? availability = null,
                                                   int? taskStatus = null,
                                                   int pageIndex = 1,
                                                   int pageSize = 10

                                                  )
        {

            if (taskId!=null&&!string.IsNullOrEmpty(taskId.Trim()))
            {
                return SendRequest<PackTaskResultResponse>(globalContext.QKApiHost, "api/PackTask/SearchNewPackTaskList", new
                {

                    
                    TaskId = taskId,
                    
                    ShopId = globalContext.User.Shop.ShopId.ToString()
                }, null, HttpMethod.Post);
            }
            return SendRequest<PackTaskResultResponse>(globalContext.QKApiHost, "api/PackTask/SearchNewPackTaskList", new
            {

                SkuId = skuId,
                TaskId = taskId,
                StartTime = startTime,
                EndTime = endTime,
                Availability = availability,
                TaskStatus = taskStatus,
                PageIndex = pageIndex,
                PageSize = pageSize,
                ShopId = globalContext.User.Shop.ShopId.ToString()
            }, null, HttpMethod.Post);
        }
        public ApiResponse<SearchTaskListResponse> GetWareHouseList(string WayBillNo=null,string SourceExpressName=null, int? isWorry = null, string departmentName = null, string skuId = null, string taskId = null,
                                                   DateTime? startTime = null,
                                                   DateTime? endTime = null,
                                                   PackTaskState? 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
            {
                IsWorry = isWorry,
                DepartmentName = departmentName,
                SkuId = skuId,
                TaskId = taskId,
                StartTime = startTime,
                EndTime = endTime,
                TaskState = TaskState,
                PageIndex = pageIndex,
                PageSize = pageSize,
                ShopName = ShopName,
                WayBillNo= WayBillNo,
                SourceExpressName=SourceExpressName,
            }, null, HttpMethod.Post);
        }
        



        public ApiResponse<ProductSkuCountsResponse> GetAllCount()
        {
            return SendRequest<ProductSkuCountsResponse>(globalContext.QKApiHost, $"api/PackTask/GetProductSkuCount?shopId={globalContext.User.Shop.ShopId.ToString()}",
               null
                , null, HttpMethod.Get);
        }
        public ApiResponse<ProductSkuCountsResponse> GetWareAllCount()
        {
            return SendRequest<ProductSkuCountsResponse>(globalContext.QKApiHost, "api/PackTask/GetProductSkuCount",
                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);
        }

        public ApiResponse<object> UpdateTaskStatus(long id, int taskStatus, string orderId)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/UpdatePackTaskStatus", new
            {
                id,
                taskStatus,
                orderId
            }
          , null, HttpMethod.Post);
        }



        /// <summary>
        /// 修改任务状态
        /// </summary>
        /// <param name="taskId"></param>
        /// <param name="packTaskState"></param>
        /// <returns></returns>
        public ApiResponse<object> SetPackTaskState(long taskId, PackTaskState packTaskState)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/SetPackTaskState", new
            {
                taskId = taskId,
                TaskState= packTaskState
            }
          , 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);

        }
        /// <summary>
        ///  获取任务的服务
        /// </summary>
        /// <returns></returns>
        public ApiResponse<PackServiceResponse> GetTaskService(long taskId)
        {
            return SendRequest<PackServiceResponse>(globalContext.QKApiHost, $"api/PackTask/GetTaskService?TaskId={taskId}",null
         , null, HttpMethod.Get);
        }
        /// <summary>
        /// 上传 更新任务的服务数据
        /// </summary>
        /// <returns></returns>
        public ApiResponse<object> UploadService(UploadServiceRequest uploadService)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/UploadService", uploadService
         , null, HttpMethod.Post);
        }


        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);
        }

        /// <summary>
        /// 获取待封箱列表
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        public ApiResponse<SearchWaitSealBoxResponse> SearchWaitSealBoxList(string ShopName = null, long? TaskId=null, string SkuId = null, int PageIndex = 1
            , int PageSize = 10)
        {
            return SendRequest<SearchWaitSealBoxResponse>(globalContext.QKApiHost, "api/PackTask/SearchWaitSealBoxList", new
            {
                ShopName,
                TaskId,
                SkuId,
                PageIndex,
                PageSize
            }, null, HttpMethod.Post);
        }

        /// <summary>
        /// 完成封箱
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        public ApiResponse<bool> CompeteSealBox( List<CompeteSealBox> CompeteSealBoxs)
        {
            return SendRequest<bool>(globalContext.QKApiHost, "api/PackTask/CompeteSealBox", new
            {
                CompeteSealBoxs
            }, null, HttpMethod.Post);
        }



    }

    public class CompeteSealBox
    {
        /// <summary>
        /// 任务Id
        /// </summary>
        public long TaskId { get; set; }
        /// <summary>
        /// 仓库Id
        /// </summary>
        public string WareId { 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; }
    }





}