using HandyControl.Controls;
using log4net;
using Newtonsoft.Json.Linq;
using SparkClient.Model.Entity.Base;
using SparkClient.Model.Helper;
using SparkClient.ViewModel.BaseWindow;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Input;

namespace SparkClient.ViewModel.Configuration.SettingsPages
{
    public class SettingsVM : BaseViewModel
    {
        private static readonly ILog Logger = LogManager.GetLogger(typeof(ModelColorSetPageVM));
        public ICommand SelectFileCommand { get; }

        public string _languageId;
        public string LanguageId { get { return _languageId; } set { _languageId = value; OnPropertyChanged(nameof(LanguageId)); } }

        public bool _txtFileChecked;
        public bool TxtFileChecked { get { return _txtFileChecked; } set { _txtFileChecked = value; OnPropertyChanged(nameof(TxtFileChecked)); } }

        public bool _stlFileChecked;
        public bool StlFileChecked { get { return _stlFileChecked; } set { _stlFileChecked = value; OnPropertyChanged(nameof(StlFileChecked)); } }

        public bool _excelFileChecked;
        public bool ExcelFileChecked { get { return _excelFileChecked; } set { _excelFileChecked = value; OnPropertyChanged(nameof(ExcelFileChecked)); } }

        public bool _datFileChecked;
        public bool DatFileChecked { get { return _datFileChecked; } set { _datFileChecked = value; OnPropertyChanged(nameof(DatFileChecked)); } }

        public string _filePath;
        public string FilePath { get { return _filePath; } set { _filePath = value; OnPropertyChanged(nameof(FilePath)); } }

        public string _ruleId;
        public string RuleId { get { return _ruleId; } set { _ruleId = value; OnPropertyChanged(nameof(RuleId)); } }

        public DataTable _languages;
        public DataTable Languages { get { return _languages; } set { _languages = value; OnPropertyChanged(nameof(Languages)); } }

        public DataTable _rules;
        public DataTable Rules { get { return _rules; } set { _rules = value; OnPropertyChanged(nameof(Rules)); } }
        public SettingsVM()
        {
            try { 
                SelectFileCommand = new RelayCommand(SelectFile);
                InitSetting();
            }
            catch (Exception ex)
            {
                Logger.Error($"全局异常捕获:{ex.Message}", ex);
            }
        }

        private void InitSetting()
        {
            try
            {
                Languages = new DataTable();
                Languages.Columns.Add("Key");
                Languages.Columns.Add("Value");
                Languages.Rows.Add("中文", "zh-cn");
                Languages.Rows.Add("English", "en");
                LanguageId = Settings.SelectValueById("LanguageId");
                if (LanguageId.Length == 0)
                {
                    LanguageId = "zh-cn";
                }
                bool.TryParse( Settings.SelectValueById("TxtFileChecked"), out bool TxtFileChecked);
                this.TxtFileChecked = TxtFileChecked;
                bool.TryParse(Settings.SelectValueById("StlFileChecked"), out bool StlFileChecked);
                this.StlFileChecked = StlFileChecked;
                bool.TryParse(Settings.SelectValueById("ExcelFileChecked"), out bool ExcelFileChecked);
                this.ExcelFileChecked = ExcelFileChecked;
                bool.TryParse(Settings.SelectValueById("DatFileChecked"), out bool DatFileChecked);
                this.DatFileChecked = DatFileChecked;
                FilePath = Settings.SelectValueById("FilePath");
                RuleId = Settings.SelectValueById("RuleId");
                selectRules();
            }
            catch (Exception ex)
            {
                Logger.Error($"全局异常捕获:{ex.Message}", ex);
            }
        }

        private void selectRules()
        {
            try
            {
                Rules = new DataTable();
                Rules.Columns.Add("Key");
                Rules.Columns.Add("Value");
                string sql = $"SELECT * FROM RULE WHERE RULE_ID NOT LIKE '%_TA_%';";
                DataTable db = DataBaseHelper.ExecuteQuery(sql);
                foreach (DataRow row in db.Rows)
                {
                    Rules.Rows.Add(row[MultilingualHelper.getString("RULE_NAME")].ToString(), row["RULE_ID"].ToString());
                }
            }
            catch (Exception ex)
            {
                Logger.Error($"全局异常捕获:{ex.Message}", ex);
            }
            //Rules.Rows.Add("IGI 2023", "IGI2023");
        }
        public bool SaveUpdate(object param)
        {
            try
            {
                if (!Directory.Exists(FilePath))
                {
                    Growl.Error(MultilingualHelper.getString("SavePathIsnotExists"));
                    return false;
                }
                MultilingualHelper.setLanguage(_languageId);

                updateDataBase();
                Growl.InfoGlobal(MultilingualHelper.getString("Save_successful_message"));
                return true;
            }
            catch (Exception ex)
            {
                Logger.Error($"全局异常捕获:{ex.Message}", ex);
                return false;
            }
        }
        private void updateDataBase()
        {
            try
            {
                // 语言设置登录
                Settings LanguageData = new Settings()
                {
                    Key = "LanguageId",
                    ItemName = "语言设置",
                    Value = LanguageId,
                };
                LanguageData.insert();
                // 上传文件登录
                Settings TxtFileCheckedData = new Settings()
                {
                    Key = "TxtFileChecked",
                    ItemName = "上传文件 TXT文件",
                    Value = TxtFileChecked.ToString(),
                };
                TxtFileCheckedData.insert();

                Settings StlFileCheckedData = new Settings()
                {
                    Key = "StlFileChecked",
                    ItemName = "上传文件 STL文件",
                    Value = StlFileChecked.ToString(),
                };
                StlFileCheckedData.insert();

                Settings ExcelFileCheckedData = new Settings()
                {
                    Key = "ExcelFileChecked",
                    ItemName = "上传文件 Excel文件",
                    Value = ExcelFileChecked.ToString(),
                };
                ExcelFileCheckedData.insert();
            
                Settings DatFileCheckedData = new Settings()
                {
                    Key = "DatFileChecked",
                    ItemName = "上传文件 Dat文件",
                    Value = DatFileChecked.ToString(),
                };
                DatFileCheckedData.insert();
                // 保存路径登录
                Settings FilePathData = new Settings()
                {
                    Key = "FilePath",
                    ItemName = "保存路径",
                    Value = FilePath,
                };
                FilePathData.insert();
                // 定级标准登录
                Settings RuleData = new Settings()
                {
                    Key = "RuleId",
                    ItemName = "定级标准",
                    Value = RuleId,
                };
                RuleData.insert();
            }
            catch (Exception ex)
            {
                Logger.Error($"全局异常捕获:{ex.Message}", ex);
            }
        }
        public void SelectFile(object param)
        {
            using (var folderBrowserDlg = new FolderBrowserDialog())
            {
                if (string.IsNullOrEmpty(FilePath))
                {
                    folderBrowserDlg.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer);
                }
                else
                {
                    folderBrowserDlg.SelectedPath = FilePath;
                }
                DialogResult result = folderBrowserDlg.ShowDialog();

                if (result == DialogResult.OK)
                {
                    FilePath = folderBrowserDlg.SelectedPath;
                }
            }
        }
    }
    /// <summary>
    /// 设定表实体
    /// </summary>
    public class Settings
    {
        private static string TABLE_NAME = "SETTING";

        [DbField("GUID")]
        public Guid GUID { get; set; }
        /// <summary>
        /// 项目名称
        /// </summary>
        [DbField("SETTING_ID")]
        public required string Key { get; set; }
        /// <summary>
        /// key
        /// </summary>
        [DbField("SETTING_NAME")]
        public required string ItemName{ get; set; }
        /// <summary>
        /// value
        /// </summary>
        [DbField("SETTING_P")]
        public required string Value { get; set; }
        /// <summary>
        /// 设定表DB登录
        /// </summary>
        /// <returns>更新数量</returns>
        public int insert()
        {
            string sql = $"SELECT * FROM {TABLE_NAME} WHERE SETTING_ID = '{Key}';";
            DataTable db = DataBaseHelper.ExecuteQuery(sql);
            if (db.Rows.Count > 0)
            {
                string updateSql = $"UPDATE {TABLE_NAME} SET SETTING_P = '{this.Value}' WHERE SETTING_ID = '{Key}';";
                return DataBaseHelper.ExecuteNonQuery(updateSql);
            }
            else
            {
                string insertSql = $"INSERT INTO {TABLE_NAME} ('GUID','SETTING_ID','SETTING_NAME','SETTING_P') VALUES('{Guid.NewGuid().ToString()}','{Key}','{ItemName}','{Value}');";
                return DataBaseHelper.ExecuteNonQuery(insertSql);
            }
        }
        /// <summary>
        /// 设定表值检索
        /// </summary>
        /// <param name="Id"></param>
        /// <returns>value</returns>
        public static string SelectValueById(string Id)
        {
            string sql = $"SELECT * FROM {TABLE_NAME} WHERE SETTING_ID = '{Id}';";
            DataTable db = DataBaseHelper.ExecuteQuery(sql);
            if (db!=null && db.Rows.Count > 0) { 
                return db.Rows[0]["SETTING_P"].ToString()??"";
            }
            else
            {
                return "";
            }
        }
    }
}