using HandyControl.Controls;
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
    {
        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()
        {
            SelectFileCommand = new RelayCommand(SelectFile);
            InitSetting();
        }

        private void InitSetting()
        {
            Languages = new DataTable();
            Languages.Columns.Add("Key");
            Languages.Columns.Add("Value");
            Languages.Rows.Add("中文", "zh-cn");
            Languages.Rows.Add("English", "en");
            LanguageId = Settings.SelectValueByName("LanguageId");
            if (LanguageId.Length == 0)
            {
                LanguageId = "zh-cn";
            }
            bool.TryParse( Settings.SelectValueByName("TxtFileChecked"), out bool TxtFileChecked);
            this.TxtFileChecked = TxtFileChecked;
            bool.TryParse(Settings.SelectValueByName("StlFileChecked"), out bool StlFileChecked);
            this.StlFileChecked = StlFileChecked;
            bool.TryParse(Settings.SelectValueByName("ExcelFileChecked"), out bool ExcelFileChecked);
            this.ExcelFileChecked = ExcelFileChecked;
            bool.TryParse(Settings.SelectValueByName("DatFileChecked"), out bool DatFileChecked);
            this.DatFileChecked = DatFileChecked;
            FilePath = Settings.SelectValueByName("FilePath");
            RuleId = Settings.SelectValueByName("RuleId");
            selectRules();
        }

        private void selectRules()
        {
            Rules = new DataTable();
            Rules.Columns.Add("Key");
            Rules.Columns.Add("Value");
            string sql = $"SELECT * FROM RULE;";
            DataTable db = DataBaseHelper.ExecuteQuery(sql);
            foreach (DataRow row in db.Rows)
            {
                Rules.Rows.Add(row[MultilingualHelper.getString("RULE_NAME")].ToString(), row["RULE_ID"].ToString());
            }
            //Rules.Rows.Add("IGI 2023", "IGI2023");
        }
        public bool SaveUpdate(object param)
        {
            if (!Directory.Exists(FilePath))
            {
                Growl.Error(MultilingualHelper.getString("SavePathIsnotExists"));
                return false;
            }
            MultilingualHelper.setLanguage(_languageId);

            updateDataBase();
            Growl.InfoGlobal(MultilingualHelper.getString("Save_successful_message"));
            return true;
        }
        private void updateDataBase()
        {
            // 语言设置登录
            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();
        }
        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;
                }
            }
        }
    }
    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; }

        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);
            }
        }

        public static string SelectValueByName(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 "";
            }
        }
    }
}