using DocumentFormat.OpenXml.EMMA;
using Elastic.Clients.Elasticsearch;
using Furion.Logging;
using Furion.RemoteRequest.Extensions;
using NetTaste;
using Newtonsoft.Json;
using System.Text;
using WCS.Application.Entity;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBBatchCreateContainerServiceVersionResponse.Types;

namespace WCS.Application;
public class HttpService
{
    private static readonly object OLock = new object();

    private dynamic Urls;

    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
    public HttpService()
    {
        var _sysConfigService = App.GetService<SysConfigService>();//todo 这里需要测试下生命周期问题
        Urls = _sysConfigService.GetSystemInfo().Result;
    }


    /// <summary>
    /// 调用WMS接口申请巷道接口
    /// </summary>
    /// <param name="palletNo"></param>
    /// <param name="startLocat"></param>
    /// <param name="taskModel"></param>
    /// <param name="ceng"></param>
    /// <param name="endLocat"></param>
    /// <param name="taskNo"></param>
    /// <returns></returns>
    public string RequestRoadWay(string palletNo, string startLocat, string taskModel, string ceng, ref string endLocat, ref string taskNo, int palletHeight)
    {
        Log.Information("调用WMS接口反馈任务接口-是否重复申请:" + palletNo);
        lock (OLock) 
        { 
            string returnStr = "";
       

            var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo);

            if (task == null)
            {
                var model = new RequestAsnTask()
                {
                    PalletNo = palletNo,
                    HouseNo = "W01",
                    TaskModel = taskModel,
                    PalletHeight = palletHeight,
                    StartLocat = startLocat
                };

                string url = Urls.WMSAddress + ":" + Urls.WMSPort;
                var result =  (url + "/api/DownAPi/RequestRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
                if (result == null)
                {
                    returnStr = "-1:调用WMS接口失败";
                    return returnStr;
                }
                Log.Information("调用WMS接口反馈任务接口" + result.ToJson());
                if (result.Success == 0)
                {

                    var taskAdd = new WcsTask()
                    {
                        TaskType = TaskTypeEnum.In,
                        Status = TaskStatusEnum.Wait,
                        Origin = "WMS",
                        StartLocate = startLocat,
                        PalletNo = palletNo,
                        TaskNo = result.TaskList.TaskNo,
                        Levels = 999,
                        EndLocate = result.TaskList.EndLocate,
                        EndRoadway = result.TaskList.EndRoadway,
                        PalletQty = palletHeight//托盘高度
                    };
                
                    _db.Insertable(taskAdd).ExecuteCommand();
                    endLocat = result.TaskList.EndRoadway;
                    returnStr = result.TaskList.EndLocate;
                    taskNo = taskAdd.TaskNo;
                }
                else
                {
                    returnStr = "-1:" + result.Message;
                    return returnStr;
                }
            }
            else
            {
                returnStr = task.EndLocate;
                endLocat = task.EndRoadway;
                taskNo = task.TaskNo;
            }

            endLocat = PLCCommon.RoadwayToStationNum(endLocat, ceng);

            return returnStr;
        }
    }

        /// <summary>
        /// 调用WMS接口自动码垛绑定信息返回巷道口
        /// </summary>
        /// <returns></returns>
        public string BindRequestRoadWay(string orderNo, string palletNo,decimal qty ,string type,string skuNo, string lotNo, string lotText, string supplierLot, List<WcsBoxInfo> detail,
        string startLocat, string taskModel, string ceng, ref string endLocat, ref string taskNo, int palletHeight)
    {
        string returnStr = "";

        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo);
        if (task == null)
        {
            var model = new BoxPalletBindVm()
            {
                OrderCode = "",//暂无上游系统编号
                AsnNo = orderNo,
                AsnDetailNo = 0,//暂无入库单明细编号,WMS根据物料批次查找
                PalletNo = palletNo,
                Qty = qty,
                Type = type,
                SkuNo = skuNo,
                LotNo = lotNo,
                LotText = lotText,
                SupplierLot = supplierLot,
                PalletHeight = palletHeight,
                Detail = detail
            };
            Log.Information("调用WMS自动码垛接口--请求报文:" + model.ToJson());
            string url = Urls.WMSAddress + ":" + Urls.WMSPort;
            var result = (url + "/api/DownApi/BindRequestRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
            Log.Information("调用WMS自动码垛接口--返回报文:" + result.ToJson());
            if (result.Success == 0)
            {
                if (result.TaskList == null)
                {
                    returnStr = $"-1:向WMS申请组托入库失败";
                    return returnStr;
                }
                var taskAdd = new WcsTask()
                {
                    TaskType = TaskTypeEnum.In,
                    Status = TaskStatusEnum.Wait,
                    Origin = "WMS",
                    StartLocate = startLocat,
                    PalletNo = palletNo,
                    TaskNo = result.TaskList.TaskNo,
                    Levels = 999,
                    EndLocate = result.TaskList.EndLocate,
                    EndRoadway = result.TaskList.EndRoadway,
                    PalletQty = palletHeight//托盘高度
                };

                _db.Insertable(taskAdd).ExecuteCommand();
                endLocat = result.TaskList.EndRoadway;
                returnStr = result.TaskList.EndLocate;
                taskNo = taskAdd.TaskNo;
            }
            else
            {
                returnStr = "-1:" + result.Message;
                return returnStr;
            }
        }
        else
        {
            returnStr = task.EndLocate;
            endLocat = task.EndRoadway;
            taskNo = task.TaskNo;
        }

        endLocat = PLCCommon.RoadwayToStationNum(endLocat, ceng);

        return returnStr;
    }
    /// <summary>
    /// 调用WMS接口申请储位接口
    /// </summary>
    /// <param name="palletNo"></param>
    /// <param name="startLocat"></param>
    /// <param name="taskModel"></param>
    /// <param name="starRoadWay"></param>
    /// <param name="taskNo"></param>
    /// <returns></returns>
    public string RequestLocate(string palletNo, string startLocat, string taskModel, string starRoadWay, ref string taskNo, int palletHeight)
    {
        string returnStr = "";


        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false 
        && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) 
        && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo && !string.IsNullOrWhiteSpace(m.EndLocate));

        if (task == null)
        {
            var model = new RequestAsnTask()
            {
                PalletNo = palletNo,
                HouseNo = "W01",
                RoadWayNo = starRoadWay,
                TaskModel = taskModel,
                PalletHeight = palletHeight
            };

            string url = Urls.WMSAddress + ":" + Urls.WMSPort;
            var result = (url + "/api/DownAPi/RequestLocation").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
            Log.Information("调用WMS申请储位接口反馈任务接口" + result.ToJson());
            if (result.Success == 0)
            {
                var taskUp = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.TaskNo == result.TaskList.TaskNo);
                if (taskUp == null)
                {
                    var taskAdd = new WcsTask()
                    {
                        TaskNo = result.TaskList.TaskNo,
                        TaskType = TaskTypeEnum.In,
                        Status = TaskStatusEnum.Wait,
                        //IsSuccess =TaskSuccessEnum.Success,
                        Origin = "WMS",
                        StartLocate = startLocat,
                        Levels = 999,
                        PalletNo = palletNo,
                        EndLocate = result.TaskList.EndLocate,
                        EndRoadway = result.TaskList.EndRoadway
                    };
                    _db.Insertable(taskAdd).ExecuteCommand();
                    HubUtil.PublicTask(taskAdd.Adapt<WcsTaskOutput>());
                }
                else
                {
                    taskUp.EndRoadway = result.TaskList.EndRoadway;
                    taskUp.EndLocate = result.TaskList.EndLocate;
                    _db.Updateable(taskUp).ExecuteCommand();
                    HubUtil.PublicTask(taskUp.Adapt<WcsTaskOutput>());
                }

               
                returnStr = result.TaskList.EndLocate;
                taskNo = result.TaskList.TaskNo;
            }
            else
            {
                returnStr = "-1:" + result.Message;
                return returnStr;
            }
        }
        else
        {
            returnStr = task.EndLocate;
            taskNo = task.TaskNo;
        }

        return returnStr;
    }


    /// <summary>
    /// 调用WMS接口 反馈任务接口
    /// </summary>
    /// <param name="model">任务完成状态</param>
    /// <returns></returns>
    public async Task<ResponseModel> RequestTask(TaskRequestWMS model)
    {
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = await (url + "/api/DownAPi/ReceiveWcsSignal").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseModel>();
        Log.Information("调用WMS接口反馈任务接口" + result.ToJson());
        return result;
    }

    /// <summary>
    /// 调用WMS接口反馈空取异常接口
    /// </summary>
    /// <param name="model">任务信息</param>
    /// <returns></returns>
    public async Task<ResponseTasks> RequestEmptyException(TaskRequest model)
    {
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = await (url + "/api/DownAPi/EmptyException").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>();
        Log.Information("调用WMS接口反馈空取异常接口" + result.ToJson());
        return result;
    }

    /// <summary>
    /// 调用WMS接口反馈满取异常接口
    /// </summary>
    /// <param name="model">任务信息</param>
    /// <returns></returns>
    public async Task<ResponseTasks> RequestFullException(TaskRequest model)
    {
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = await (url + "/api/DownAPi/FullException").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>();
        Log.Information("调用WMS接口反馈满取异常接口" + result.ToJson());
        return result;
    }

    /// <summary>
    /// 调用WMS接口申请空托跺出库
    /// </summary>
    /// <param name="Num"></param>
    /// <param name="OutMode"></param>
    /// <returns></returns>
    public string IssuePlnOutHouseWcs(string Num,string OutMode)
    {
        string returnStr = "";

        var model = new OutPalletModel()
        {
            Num = Num,//出库跺数
            OutMode = OutMode//出库口
        };
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = (url + "/api/DownAPi/IssuePlnOutHouseWcs").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseOutPallet>().Result;
        Log.Information("调用WMS接口反馈任务接口" + result.ToJson());

        if (result.Success == 0)
        {
            foreach (var item in result.TaskList)
            {
                var taskUp = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.TaskNo == item.TaskNo);
                if (taskUp == null)
                {
                    var taskAdd = new WcsTask()
                    {
                        TaskNo = item.TaskNo,
                        TaskType = (TaskTypeEnum)(int.Parse(item.TaskType)),
                        Status = TaskStatusEnum.Wait,
                        //IsSuccess =TaskSuccessEnum.Success,
                        Origin = "WMS",
                        StartLocate = item.StartLocate,
                        StartRoadway=item.StartRoadway,
                        PalletNo = item.PalletNo,
                        Levels = 999,
                        EndLocate = item.EndLocate,
                        EndRoadway = item.EndRoadway
                    };
                    _db.Insertable(taskAdd).ExecuteCommand();
                    HubUtil.PublicTask(taskAdd.Adapt<WcsTaskOutput>());
                }
                else
                {
                    taskUp.EndRoadway = item.EndRoadway;
                    taskUp.EndLocate = item.EndLocate;
                    _db.Updateable(taskUp).ExecuteCommand();
                    HubUtil.PublicTask(taskUp.Adapt<WcsTaskOutput>());
                }
            }
        }
        else
        {
            returnStr = "-1:" + result.Message;
            return returnStr;
        }
        return returnStr;
    }
    /// <summary>
    /// 调用WMS接口给小车下发入库任务
    /// </summary>
    /// <param name="endLocation"></param>
    /// <returns></returns>
    public async Task<ResponseModel> IssuedAgvTask(string endLocation)
    {
        var model = new
        {
            EndLocation = endLocation
        };
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = await (url + "/api/DownAPi/WcsIssuedAgvTask").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseModel>();
        Log.Information("调用WMS接口WCS申请给小车下发入库任务接口" + result.ToJson());
        return result;
    }

    /// <summary>
    /// 根据出库任务号获取出库单类型
    /// </summary>
    /// <param name="endLocation"></param>
    /// <returns></returns>
    public async Task<ResponseModel> GetSoOrderTypeByTaskNo(string taskNo)
    {
        var model = new
        {
            TaskNo = taskNo
        };
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = await (url + "/api/DownAPi/GetSoOrderTypeByTaskNo").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseModel>();
        Log.Information("调用WMS接口根据出库任务号获取出库单类型" + result.ToJson());
        return result;
    }

    /// <summary>
    /// 根据托盘号获取托盘上物料品种信息
    /// </summary>
    /// <param name="palletNo">托盘号</param>
    /// <returns></returns>
    public string GetPalletPzNo(string palletNo)
    {
        var model = new
        {
            PalletNo = palletNo
        };
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = (url + "/api/DownAPi/GetStockDetailByPalletNo").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseSkuInfo>().Result;
        Log.Information("调用WMS接口根据托盘号获取托盘库存明细信息" + result.ToJson());

        string pzNo = string.Empty;
        if (result.Success == 0)
        {
            var palletSkuInfo = result.PalletSkuInfo;
            var pzInfo = _db.Queryable<WcsMateialPzInfo>().First(w => w.SkuNo == palletSkuInfo.SkuNo && w.SkuName == palletSkuInfo.SkuName);
            if (pzInfo != null)
            {
                pzNo = pzInfo.PZNo;
            }
        }
        return pzNo;
    }
    /// <summary>
    /// 成品箱码拆垛拣货
    /// </summary>
    /// <param name="taskNo"></param>
    /// <returns></returns>
    public string BoxUnstackd(string palletNo)
    {
        string returnStr = "";
        var model = new
        {
            PalletNo = palletNo
        };
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = (url + "/api/DownAPi/BoxUnstackd").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<WmsResponseModel>().Result;
        Log.Information("调用WMS接口成品箱码拆垛拣货" + result.ToJson());

        if (result.Success != 0)
        {
            returnStr = "-1:" + result.Message;
        }
        return returnStr;
    }

    /// <summary>
    /// 叠托机申请空托跺绑定
    /// </summary>
    /// <param name="palletNo"></param>
    /// <returns></returns>
    public string BindNullPalletWcs(int qty,string palletNo)
    {
        string returnStr = "";
        var model = new
        {
            PalletNo = palletNo,
            Qty = qty,
        };
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var result = (url + "/api/DownAPi/BindNullPalletWcs").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseSkuInfo>().Result;
        Log.Information("调用WMS接口叠托机绑定空托跺" + result.ToJson());

        if (result.Success != 0)
        {
            returnStr = "-1:" + result.Message;
        }
        return returnStr;
    }
}