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> SearchTaskList(string skuId = null, string taskId = null
                                                  , string spuId = null, string orderSn = null,
                                                   TaskState? TaskState = null,
                                                   int pageIndex = 1,
                                                   int pageSize = 10
                                                   
                                                  )
        {


            return SendRequest<SearchTaskListResponse>(globalContext.QKApiHost, "api/PackTask/SearchTaskList", new
            {
               
                orderSn,
                spuId,
                skuId,
                taskId,
                TaskState,
                pageIndex,
                pageSize,
                ShopId = globalContext.User.Shop.ShopId.ToString(),

            }, null, HttpMethod.Post);
        }
        public ApiResponse<SearchTaskListResponse> SearchTaskList(string WayBillNo = null, string SourceExpressName = null, string departmentName = null, string skuId = null, string taskId = null,
                                                    string spuId = null, string orderSn = null,
                                                   TaskState? TaskState = null,
                                                   string ShopName = null,
                                                   int pageIndex = 1,
                                                   int pageSize = 10,
                                                   string SkuTitle = null,
                                                   string SpuTitle = null
                                                  )
        {

            return SendRequest<SearchTaskListResponse>(globalContext.QKApiHost, "api/PackTask/SearchTaskList", new
            {
                SkuTitle,
                SpuTitle,
                DepartmentName = departmentName,
                SkuId = skuId,
                TaskId = taskId,
                TaskState = TaskState,
                PageIndex = pageIndex,
                PageSize = pageSize,
                ShopName = ShopName,
                WayBillNo = WayBillNo,
                SourceExpressName = SourceExpressName,
                spuId,
                orderSn
            }, 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> SearchProduct(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);
        //}


        public ApiResponse<ShopTotalResponse> ShopTotalV2(string skuId,
                                                       string taskId,
                                                       string shopId,
                                                  DateTime? startTime,
                                                  DateTime? endTime,
                                                  string ShopName,
                                                  string DepartmentName,
                                                  int pageIndex = 1,
                                                  int pageSize = 10
                                                 )
        {
            return SendRequest<ShopTotalResponse>(globalContext.QKApiHost, "api/PackTask/ShopTotalV2", new
            {
                shopId,
                skuId,
                taskId,
                startTime,
                endTime,
                DepartmentName,
                ShopName,
                pageIndex,
                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> 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="orderId"></param>
        /// <param name="sourceSkuId"></param>
        /// <returns></returns>
        public ApiResponse<object> ManualSign(string wayBillNo)
        {
            return SendRequest<object>("http://bbwyb.qiyue666.com", $"Api​/PurchaseOrder​/ManualSign", new
            {
                wayBillNo
            }, null, HttpMethod.Post);
        }
        /// <summary>
        /// 批量手动发货
        /// </summary>
        /// <param name="orderId"></param>
        /// <param name="sourceSkuId"></param>
        /// <returns></returns>
        public ApiResponse<object> BatchManualSign(string[] wayBillNoList)
        {
            return SendRequest<object>("http://bbwyb.qiyue666.com", $"api/purchaseorder/batchmanualsign", new { wayBillNoList }, null, HttpMethod.Post);
        }

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

        public ApiResponse<object> SubmitOverTimeMarkMsg(OverTimeTaskType OverTimeTaskType, long Id, string MarkMsg)
        {
            return SendRequest<object>(globalContext.QKApiHost, $"api/PackTask/SubmitOverTimeMarkMsg", new
            {
                OverTimeTaskType,
                Id,
                MarkMsg,
            }, null, HttpMethod.Post);
        }

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


        public ApiResponse<StoreGetSelfResponse> GetStoreGetSelfData(long taskId)
        {
            return SendRequest<StoreGetSelfResponse>(globalContext.QKApiHost, $"api/PackTask/GetStoreGetSelfData?taskid={taskId}", null, null, HttpMethod.Get);
        }


        public ApiResponse<object> StoreGetBySelfV2(long taskId, int storeGetCount, string PickerUserName)
        {

            return SendRequest<object>(globalContext.QKApiHost, $"api/PackTask/StoreGetBySelfV2", new {
                taskId,
                storeGetCount,
                PickerUserName,
                OperatorUserName= globalContext.User.Name
            }, null, HttpMethod.Post);
        }

        public ApiResponse<SearchStoreGetSelfResponse> SearchStoreGetSelfList(string taskId, string OrderSn, string SpuId, string SkuId,string DepartmentName, string ShopName, int? pageIndex, int pageSize, string ShopId)
        {

            return SendRequest<SearchStoreGetSelfResponse>(globalContext.QKApiHost, $"api/PackTask/SearchStoreGetSelfList", new
            {
                taskId,
                OrderSn,
                SpuId,
                SkuId,
                DepartmentName, ShopName,
                ShopId , pageIndex, pageSize,
            }, null, HttpMethod.Post);
        }

        public ApiResponse<object> AddSealBoxProduct(string skuId, PositionType positionType, int count)
        {
            return SendRequest<object>(globalContext.QKApiHost, $"api/PackTask/AddSealBoxProduct", new
            {
                skuId,
                positionType,
                SkuCount = count,
                ShopId = globalContext.User.Shop.ShopId.ToString(),
                UserId = globalContext.User.Id.ToString()
            }, null, HttpMethod.Post);
        }



        /// <summary>
        /// 创建任务 新版
        /// </summary>
        /// <param name="createTaskRequest"></param>
        /// <returns></returns>
        public ApiResponse<object> CreatePackTaskV2(CreatePackTaskV2Request createTaskRequest)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/CreatePackTaskV2",
               createTaskRequest
            , null, HttpMethod.Post);
        }


        /// <summary>
        /// 创建任务 新版
        /// </summary>
        /// <param name="createTaskRequest"></param>
        /// <returns></returns>
        public ApiResponse<object> UpdatePackTaskV2(UpdatePackTaskV2Request createTaskRequest)
        {
            return SendRequest<object>(globalContext.QKApiHost, "api/PackTask/UpdatePackTaskV2",
               createTaskRequest
            , 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>
        /// 
        /// </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; }
    }


}