using Newtonsoft.Json;
using PlcSiemens.Core.Extension;
using ServiceCenter.Extensions;
using ServiceCenter.Logs;
using ServiceCenter.SqlSugars;
using System.ComponentModel;
using WCS.Core;
using WCS.Entity;
using WCS.Entity.Protocol.BCR;
using WCS.Entity.Protocol.Station;
using WCS.WorkEngineering.Extensions;
using WCS.WorkEngineering.Worlds;
using wms.sqlsugar.model.fj;
using TaskStatus = WCS.Entity.TaskStatus;

namespace WCS.WorkEngineering.Systems
{
    /// <summary>
    ///  满轮主线预写入目标地址
    /// </summary>
    [BelongTo(typeof(SortingMainLineWorld))]
    [Description("满轮主线预写入目标地址")]
    public class 满轮主线预写入目标地址 : DeviceSystem<Device<IStation523, IBCR83, IStation525>>
    {
        protected override bool ParallelDo => true;

        public override void Do(Device<IStation523, IBCR83, IStation525> obj)
        {
            try
            {
                var devCode = obj.Entity.Code switch
                {
                    "18" => "22",
                    "38" => "41",
                    "58" => "61",
                    "118" => "122",
                    "138" => "141",
                    "158" => "161",
                    _ => throw new ArgumentOutOfRangeException()
                };
                var dev = new Device<IStation520>(Device.All.First(x => x.Code == devCode), World);
                dev.Data.Mode = StationMode.Automatic;
                //从DB83中获取待处理条码组
                var pendingBcrList = obj.Data2.GetBcrCodeList().Where(x => !x.IsNullOrEmpty());
                //从DB525获取已处理条码组
                var cacheBcrList = obj.Data3.GetBcrCodeList();
                //筛选出未处理条码组
                var codes = pendingBcrList.Where(x => !cacheBcrList.Contains(x));
                World.Log($"扫码器:{JsonConvert.SerializeObject(pendingBcrList)}");
                World.Log($"缓存信息:{JsonConvert.SerializeObject(cacheBcrList)}");
                //循环处理所有缓存条码组中没有的条码
                foreach (var bcrCode in codes)
                {
                    WCS_TaskInfo taskInfo = null;
                    fjSysConfig config = new fjSysConfig();
                    SqlSugarHelper.Do(_db =>
                    {
                        var db = _db.Default;
                        var task = db.Queryable<WCS_TaskInfo>().NoLock().First(x => x.BarCode == bcrCode && x.Status == TaskStatus.NewBuild);
                        if (task == null)
                        {
                            World.Log($"{bcrCode}:找不到匹配的任务", LogLevelEnum.High);
                            return;
                        }
                        var config1 = db.Queryable<fjSysConfig>().NoLock().First(x => x.Code == $"{task.WarehouseCode}-Flow");
                        if (config1 == null)
                        {
                            config.Code = "4";
                        }

                        config = config1;
                        taskInfo = task;
                    });
                    if (taskInfo == null)
                    {
                        continue;
                    }
                    var srmCode = taskInfo.WarehouseCode.WarehouseToSrm();
                    var path = DevicePath.GetPath(obj.Entity.Code, srmCode);
                    if (path == null || path is { Points.Count: < 2 })
                    {
                        World.Log($"{bcrCode}:路径错误，当前位置{obj.Entity.Code}，目标位置:{srmCode}", LogLevelEnum.High);
                        continue;
                    }

                    var next = path.Points[1].Code;

                    #region 计算应该去哪个分拣库

                    //应该要去的分拣库

                    if (taskInfo.WarehouseCode.Contains("N"))
                    {
                        next = config.Code switch
                        {
                            "1" => "418",
                            "2" => "818",
                            "3" => "1218",
                            _ => next
                        };
                    }
                    else if (taskInfo.WarehouseCode.Contains("S"))
                    {
                        next = config.Code switch
                        {
                            "1" => "618",
                            "2" => "1018",
                            "3" => "1418",
                            _ => next
                        };
                    }

                    #endregion 计算应该去哪个分拣库

                    if (taskInfo == null) continue;
                    //开始赋值
                    obj.Data3.GetType().GetProperty($"TaskNumber{obj.Data3.NextIndex}")
                        .SetValue(obj.Data3, taskInfo.ID);
                    obj.Data3.GetType().GetProperty($"TaskNumber{obj.Data3.NextIndex}")
                        .SetValue(obj.Data3, taskInfo.ID);
                    obj.Data3.GetType().GetProperty($"GoodsEnd{obj.Data3.NextIndex}")
                        .SetValue(obj.Data3, next.ToShort());
                    obj.Data3.GetType().GetProperty($"GoodsEnd{obj.Data3.NextIndex}")
                        .SetValue(obj.Data3, next.ToShort());
                    obj.Data3.GetType().GetProperty($"BcrCode{obj.Data3.NextIndex}").SetValue(obj.Data3, bcrCode);
                    if (obj.Data3.NextIndex >= 49)
                    {
                        obj.Data3.NextIndex = 0;
                    }
                    else
                    {
                        obj.Data3.NextIndex++;
                    }
                }

                dev.Data.Mode = StationMode.Automatic;
            }
            catch (Exception e)
            {
                World.Log($"{e.Message}:---{e.StackTrace}", LogLevelEnum.High);
            }
        }

        public override bool Select(Device dev)
        {
            var codes = new List<string>();
            if (WorkStart.WareHouses.Contains("FJ1")) codes.AddRange(new List<string>() { "18", "118" });
            if (WorkStart.WareHouses.Contains("FJ2")) codes.AddRange(new List<string>() { "38", "58" });
            if (WorkStart.WareHouses.Contains("FJ3")) codes.AddRange(new List<string>() { "138", "158" });

            return codes.Contains(dev.Code);
            return false;
        }
    }

    /// <summary>
    ///  主线分流
    /// </summary>
    public class MainlineDiversion
    {
        /// <summary>
        ///  任务号
        /// </summary>
        public int TaskId { get; set; }

        /// <summary>
        ///  仓库号
        /// </summary>
        public string WarehouseCode { get; set; }
    }
}