using SlMesDbIterface;
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using static System.Configuration.ConfigurationManager;

namespace MES_SIGNAL_CONF
{
    public partial class MES_CONF : Form
    {


        public MES_CONF()
        {
            InitializeComponent();
            label_ReadExcel.Text = $"读取位置：{MisDataSaveDate.MesServerMisDataFun.BasicDataTableFile}";
            label_WriteSql.Text = $"写入位置：{MisDataSaveDate.MesServerMisDataFun.ConnectionString_MES}";
        }

        private void btn_ConfigToSql_Click(object sender, EventArgs e)
        {
            LoadOpcData();
            WriteLog("");
        }

        public void WriteLog(string msg)
        {
            txt_Msg.Text = txt_Msg.Text + $"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}]{msg}\r\n";
        }

        /// <summary>
        /// 线体类型枚举定义
        /// 1 = 普通工位（默认）
        /// 2 = 库位
        /// 3 = 磨合库位
        /// 4 = 总装断路器接驳库位
        /// </summary>
        private enum LineType
        {
            Normal = 1,                      // 普通工位 - 使用 MES_信号表模板
            Storage = 2,                     // 库位 - 使用 MES_信号表模板(库位)
            RunInStorage = 3,                // 磨合库位 - 使用 MES_信号表模板(磨合库位)
            BreakerDockStorage = 4           // 总装断路器接驳库位 - 使用 MES_信号表模板(总装断路器接驳库位)
        }

        /// <summary>
        /// 线体类型与信号表模板的映射配置
        /// Key: 线体类型枚举
        /// Value: Excel中的模板Sheet名称
        /// </summary>
        private static readonly System.Collections.Generic.Dictionary<LineType, string> LineTypeTemplateMapping =
            new System.Collections.Generic.Dictionary<LineType, string>
        {
            { LineType.Normal, "MES_信号表模板" },
            { LineType.Storage, "MES_信号表模板(库位)" },
            { LineType.RunInStorage, "MES_信号表模板(磨合库位)" },
            { LineType.BreakerDockStorage, "MES_信号表模板(总装断路器接驳库位)" }
        };

        private void LoadOpcData()
        {
            DataTable dt_Tag = null;

            Select_Station(out DataTable dt_Station);
            DataTable dt_Tag_Mes = new DataTable();
            if (NPOITest.ExeclHelper.ExcelToDataTable(MisDataSaveDate.MesServerMisDataFun.BasicDataTableFile, "MES_基本变量原始数据", true).Select($"是否启用='1'").Length > 0)
            {
                dt_Tag_Mes = NPOITest.ExeclHelper.ExcelToDataTable(MisDataSaveDate.MesServerMisDataFun.BasicDataTableFile, "MES_基本变量原始数据", true).Select($"是否启用='1'").CopyToDataTable();
            }

            // 加载各类型信号表模板
            var templateCache = new System.Collections.Generic.Dictionary<LineType, DataTable>();
            foreach (var mapping in LineTypeTemplateMapping)
            {
                try
                {
                    var templateData = NPOITest.ExeclHelper.ExcelToDataTable(
                        MisDataSaveDate.MesServerMisDataFun.BasicDataTableFile,
                        mapping.Value,
                        true);
                    var enabledRows = templateData.Select($"是否启用='1'");
                    if (enabledRows.Length > 0)
                    {
                        templateCache[mapping.Key] = enabledRows.CopyToDataTable();
                    }
                }
                catch (Exception ex)
                {
                    WriteLog($"加载模板 [{mapping.Value}] 失败: {ex.Message}");
                }
            }

            var dt_Device = NPOITest.ExeclHelper.ExcelToDataTable(MisDataSaveDate.MesServerMisDataFun.BasicDataTableFile, "设备类型对应表", true).Select($"是否启用='1'").CopyToDataTable();

            // 使用默认模板结构初始化结果表
            dt_Tag = templateCache.ContainsKey(LineType.Normal)
                ? templateCache[LineType.Normal].Clone()
                : new DataTable();

            // 按线体类型分组处理工位
            foreach (var lineTypeEntry in LineTypeTemplateMapping)
            {
                var lineTypeValue = ((int)lineTypeEntry.Key).ToString();
                DataRow[] stationRows;

                if (lineTypeEntry.Key == LineType.Normal)
                {
                    // 普通工位：线体类型=1 或 NULL 或 空值，同时排除所有特殊类型（2, 3, ...）
                    // 构建排除条件：(线体类型 IS NULL OR 线体类型 = '' OR 线体类型 = '1' OR (线体类型 <> '2' AND 线体类型 <> '3' ...))
                    var specialTypeValues = LineTypeTemplateMapping.Keys
                        .Where(lt => lt != LineType.Normal)
                        .Select(lt => (int)lt)
                        .ToList();

                    // 筛选出所有非特殊类型的工位
                    stationRows = dt_Station.AsEnumerable()
                        .Where(row =>
                        {
                            var lineTypeVal = row["线体类型"]?.ToString()?.Trim() ?? "";
                            // 空值或NULL视为普通工位
                            if (string.IsNullOrEmpty(lineTypeVal)) return true;
                            // 尝试解析为数字
                            if (int.TryParse(lineTypeVal, out int lineTypeInt))
                            {
                                // 不是特殊类型则为普通工位
                                return !specialTypeValues.Contains(lineTypeInt);
                            }
                            // 无法解析为数字，视为普通工位
                            return true;
                        })
                        .ToArray();
                }
                else
                {
                    // 特殊类型：精确匹配
                    stationRows = dt_Station.Select($"线体类型 = '{lineTypeValue}'");
                }

                if (stationRows.Length == 0) continue;
                if (!templateCache.ContainsKey(lineTypeEntry.Key))
                {
                    WriteLog($"警告: 线体类型 [{lineTypeEntry.Key}] 的模板未加载，跳过 {stationRows.Length} 个工位");
                    continue;
                }

                var templateTable = templateCache[lineTypeEntry.Key];

                foreach (DataRow stationRow in stationRows)
                {
                    var 工位代码 = stationRow["工位代码"].ToString();
                    var 工位名称 = stationRow["工位名称"].ToString();
                    var PLC = stationRow["PLC"].ToString();
                    var stationName = stationRow["工位号"].ToString();
                    var PLC代码 = stationRow["PLC代码"].ToString();

                    var dt_Tag_Model_Copy = templateTable.Copy();
                    UpdateOpTable(dt_Tag_Model_Copy, 工位代码, stationName, 工位名称, PLC, PLC代码);
                    dt_Tag.Merge(dt_Tag_Model_Copy);
                }
            }

            dt_Tag.Merge(dt_Tag_Mes);
            dt_Tag.TableName = "MES_基本变量_原始数据";
            SqlOperation.ExecuteSql($"truncate table {dt_Tag.TableName}", out string err1);
            if (err1 != "") WriteLog($"truncate table {dt_Tag.TableName}：{err1}");
            WriteLog($"清空了数据库表：{dt_Tag.TableName}");
            SqlOperation.SqlbulkcopyInsert(dt_Tag, out string err2);
            if (err2 != "") WriteLog($"写入数据库表 {dt_Tag.TableName}：{err2}");
            WriteLog($"写入数据库表：{dt_Tag.TableName}");

            // 调用存储过程：根据 XD_产线报警定义 + 工位表 自动生成报警点位
            WriteLog("开始生成报警点位...");
            SqlOperation.ExecuteSql("EXEC MES_基本变量_原始数据_报警数据_增加", out DataTable dtAlarmResult, out string errAlarm);
            if (errAlarm != "")
            {
                WriteLog($"生成报警点位失败：{errAlarm}");
            }
            else
            {
                if (dtAlarmResult != null && dtAlarmResult.Rows.Count > 0)
                {
                    foreach (DataRow row in dtAlarmResult.Rows)
                    {
                        WriteLog($"  {row["工位号"]}：生成 {row["生成数量"]} 条报警变量");
                    }
                }
                WriteLog("报警点位生成完成！");
            }

            dt_Device.TableName = "MES_基本变量设备类型对应表";
            SqlOperation.ExecuteSql($"truncate table {dt_Device.TableName}", out string err11);
            if (err11 != "") WriteLog($"truncate table {dt_Device.TableName}：{err11}");

            WriteLog($"清空了数据库表：{dt_Device.TableName}");
            SqlOperation.SqlbulkcopyInsert(dt_Device, out string err22);
            if (err22 != "") WriteLog($"清空了数据库表 {dt_Device.TableName}：{err22}");
            WriteLog($"写入数据库表：{dt_Device.TableName}");

        }


        private void UpdateOpTable(DataTable dt, string 工位代码, string opName, string opNameName, string ip, string dbName)
        {
            foreach (DataRow row in dt.Rows)
            {
                //TagID		TagName   工位号	数据来源	IP	DbName  变量特点  变量类型代码

                var TagID = row["TagID"].ToString();

                row["TagID"] = TagID.Replace("****", 工位代码.PadLeft(4, '0'));
                //row["TagID"] = Guid.NewGuid().ToString ().ToUpper ();
                row["工位号"] = opName;
                row["数据来源"] = opNameName;
                row["IP"] = ip;
                row["DbName"] = dbName;

                row["监控组"] = $"{row["监控组"].ToString()}_{opName}";


            }
        }

        public static void Select_Station(out DataTable dt)
        {
            var sql =
             $" SELECT *" +
             $" FROM [MES_计划BOM_工位与名称] WHERE [是否启用MES] = 1" +
             $" ORDER BY [工位号]";
            SqlOperation.ExecuteSql(sql, out dt, out string error);
        }

        public static void Select_OpTable_Alarm(out DataTable dt)
        {
            var sql =
             $" SELECT *" +
             $" FROM [MES_基本变量_原始数据] WHERE [type] = 9" +
             $" ORDER BY [TagID]";
            SqlOperation.ExecuteSql(sql, out dt, out string error);
        }


        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}
