using HandyControl.Controls;
using System.Data;
using System.Windows.Controls;
using System.Windows.Input;
using SparkClient.Model.Entity;
using SparkClient.Model.Helper;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip;
using System.Text.RegularExpressions;
using Microsoft.Data.Sqlite;

namespace SparkClient.ViewModel.Configuration;

public class CutConfigVM: BaseViewModel
{
    public ICommand AddRowsCommand { get; }
    public ICommand SaveCutConfigDataCommand { get; }
    public ICommand DelCutRowCommand { get; }

    public DataTable _cutterInfos;
    public DataTable CutterInfos { get { return _cutterInfos; } set { _cutterInfos = value; OnPropertyChanged("CutterInfos"); } }

    private int RowNo = 0; 
    public CutConfigVM()
    {
        AddRowsCommand = new RelayCommand(AddRows);

        SaveCutConfigDataCommand = new RelayCommand(SaveCutConfigData);

        DelCutRowCommand = new RelayCommand(DelCutRow);
        // 初始化VIEW层参数
        // 初始化VIEW层Command
        this.InitCutConfigData(null);
    }
    

    /// <summary>
    /// 初始化切工仪数据
    /// </summary>
    /// <param name="param"></param>
    public void InitCutConfigData(object param)
    {
        string sql = @"SELECT ITEM_NAME as ItemName , KEY AS Key, VALUE AS Value, GUID FROM CUTTER_CONFIG";
        DataTable dataTable = DataBaseHelper.ExecuteQuery(sql);
        if (dataTable!=null) {
            dataTable.Columns.Add(new DataColumn("RowNo", typeof(int)));
            foreach (DataRow row in dataTable.Rows)
            {
                row["RowNo"] = RowNo++;
            }
            CutterInfos = dataTable;
        }
    }

    /// <summary>
    /// 添加行
    /// </summary>
    /// <param name="row">行数</param>
    public void AddRows(object row)
    {
        for (int i = 0;i<5;i++)
        {
            CutterInfos.Rows.Add("", "", "",Guid.NewGuid(), RowNo++);
        }
    }

    /// <summary>
    /// 保存数据
    /// </summary>
    /// <param name="param"></param>
    public void SaveCutConfigData(object param)
    {
        int count = CutterInfos.AsEnumerable().Where(r => r["Key"].ToString() != "").GroupBy(r => new { key = r.Field<string>("Key") }).Count();
        if (count < CutterInfos.AsEnumerable().Where(r => r["Key"].ToString() != "").Count())
        {
            Growl.Error("Key有重复数据");
            return;
        }
        string sql = @"SELECT ITEM_NAME as ItemName , KEY AS Key, VALUE AS Value, GUID FROM CUTTER_CONFIG";
        DataTable dataTable = DataBaseHelper.ExecuteQuery(sql);
        int insertCount = 0;
        foreach (DataRow row in CutterInfos.Rows)
        {
            if (row["Key"].ToString() == "")
            {
                continue;
            }
            DataRow? removerow = dataTable.AsEnumerable().Where(r => r["GUID"].ToString() == row["GUID"].ToString()).FirstOrDefault();
            if (removerow != null)
            {
                CutterConfigEntity entity = new CutterConfigEntity()
                { 
                    ItemName = row["ItemName"].ToString() ?? "",
                    Key = row["Key"].ToString() ?? "",
                    Value = row["Value"].ToString() ?? "",
                    GUID = Guid.Parse(row["GUID"].ToString()??"")
                };
                sql = entity.GenerateUpdateSQL();
                SqliteParameter[] sqliteParameters = { 
                    new SqliteParameter("@ITEM_NAME", row["ItemName"].ToString()),
                    new SqliteParameter("@KEY", row["Key"].ToString()),
                    new SqliteParameter("@VALUE", row["Value"].ToString()),
                    new SqliteParameter("@GUID", row["GUID"].ToString()),
                };
                insertCount += DataBaseHelper.ExecuteNonQuery(sql, sqliteParameters);
                dataTable.Rows.Remove(removerow);
            }
            else
            {
                CutterConfigEntity entity = new CutterConfigEntity()
                {
                    ItemName = row["ItemName"].ToString() ?? "",
                    Key = row["Key"].ToString() ?? "",
                    Value = row["Value"].ToString() ?? ""
                };
                sql = entity.GenerateInsertSQL();
                SqliteParameter[] sqliteParameters = {
                    new SqliteParameter("@ItemName", row["ItemName"].ToString()),
                    new SqliteParameter("@Key", row["Key"].ToString()),
                    new SqliteParameter("@Value", row["Value"].ToString()),
                    new SqliteParameter("@GUID", row["GUID"].ToString()),
                };
                insertCount += DataBaseHelper.ExecuteNonQuery(sql, sqliteParameters);
            }
        }
        foreach (DataRow row in dataTable.Rows)
        {
            Guid.TryParse(row["GUID"].ToString(), out Guid result);
            CutterConfigEntity entity = new CutterConfigEntity()
            {
                ItemName = row["ItemName"].ToString() ?? "",
                Key = row["Key"].ToString() ?? "",
                Value = row["Value"].ToString() ?? "",
                GUID = result
            };
            sql = entity.GenerateDeleteSQL();
            insertCount += DataBaseHelper.ExecuteNonQuery(sql);
        }
        if (insertCount>=0)
        {
            Growl.Info("保存成功");
        }
        else
        {
            Growl.Error("保存失败");
        }
    }

    /// <summary>
    /// 删除一行数据
    /// </summary>
    /// <param name="row">行</param>
    public void DelCutRow(object row)
    {
        DataRowView? a = row as DataRowView;
        if (a != null)
        {
            CutterInfos.Rows.Remove(a.Row);
        }
    }
}