using Entity.Sugar;
using Euro.Transfer.Base;
using SqlSugar.Base;
using System;
using System.Configuration;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Xml;

namespace Euro.Transfer
{
    public class Common
    {
        #region GetAppSetting

        /// <summary>
        /// 獲取WebService的配置信息
        /// </summary>
        /// <param name="sKey">appSettings中配置的Key值</param>
        /// <example></example>
        /// <returns>appSettings中配置的value值</returns>
        public static string GetAppSetting(string sKey)
        {
            return ConfigurationManager.AppSettings[sKey].ToString();
        }

        #endregion GetAppSetting

        #region UpdateAppSettings

        /// <summary>
        /// 修改config配置
        /// </summary>
        /// <param name="key">要修改的key</param>
        /// <param name="value">修改的值</param>
        /// <returns></returns>
        public static bool UpdateAppSettings(string key, string value)
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            if (!config.HasFile)
            {
                throw new ArgumentException("程序配置文件缺失!");
            }
            var _key = config.AppSettings.Settings[key];
            if (_key == null)
                config.AppSettings.Settings.Add(key, value);
            else
                config.AppSettings.Settings[key].Value = value;
            config.Save(ConfigurationSaveMode.Modified);
            return true;
        }

        #endregion UpdateAppSettings

        #region ConfigSetValue

        /// <summary>
        /// 写操作
        /// </summary>
        /// <param name="AppKey"></param>
        /// <param name="AppValue"></param>
        /// <param name="sExecutablePath">todo: describe sExecutablePath parameter on ConfigSetValue</param>
        public static void ConfigSetValue(string sExecutablePath, string AppKey, string AppValue)
        {
            if (!Directory.Exists(sExecutablePath))
            {
                sExecutablePath = System.Windows.Forms.Application.StartupPath.ToString();
            }
            var xDoc = new XmlDocument();
            //获取可执行文件的路径和名称
            xDoc.Load(sExecutablePath + ".config");

            XmlNode xNode;
            XmlElement xElem1;
            XmlElement xElem2;
            xNode = xDoc.SelectSingleNode("//connectionStrings");
            // xDoc.Load(System.Windows.Forms.Application.ExecutablePath + ".config");
            xElem1 = (XmlElement)xNode.SelectSingleNode("//add[@name='" + AppKey + "']");
            if (xElem1 != null) xElem1.SetAttribute("connectionString", AppValue);
            else
            {
                xElem2 = xDoc.CreateElement("add");
                xElem2.SetAttribute("name", AppKey);
                xElem2.SetAttribute("connectionString", AppValue);
                xNode.AppendChild(xElem2);
            }
            xDoc.Save(sExecutablePath + "Euro.Transfer.exe.config");
        }

        #endregion ConfigSetValue

        #region ConfigGetValue

        /// <summary>
        /// 读操作
        /// </summary>
        /// <param name="appKey"></param>
        /// <param name="sExecutablePath">todo: describe sExecutablePath parameter on ConfigGetValue</param>
        /// <returns></returns>
        public static string ConfigGetValue(string sExecutablePath, string appKey)
        {
            if (!Directory.Exists(sExecutablePath))
            {
                sExecutablePath = System.Windows.Forms.Application.StartupPath.ToString() + "/";
            }
            var xDoc = new XmlDocument();
            try
            {
                xDoc.Load(sExecutablePath + "Euro.Transfer.exe.config");

                XmlNode xNode;
                XmlElement xElem;
                xNode = xDoc.SelectSingleNode("//appSettings");
                xElem = (XmlElement)xNode.SelectSingleNode("//add[@key='" + appKey + "']");
                if (xElem != null)
                    return xElem.GetAttribute("value");
                else
                    return "";
            }
            catch (Exception)
            {
                return "";
            }
        }

        #endregion ConfigGetValue

        #region fnCreateDir

        /// <summary>
        /// 創建目錄
        /// </summary>
        /// <param name="strPath"></param>
        public static void FnCreateDir(string strPath)
        {
            if (!Directory.Exists(strPath))
            {
                Directory.CreateDirectory(strPath);
            }
        }

        #endregion fnCreateDir

        #region GetSystemSetting

        /// <summary>
        /// 獲取系統設定
        /// </summary>
        /// <param name="sOrgID">todo: describe sOrgID parameter on GetSystemSetting</param>
        /// <param name="sItemID">todo: describe sItemID parameter on GetSystemSetting</param>
        /// <returns></returns>
        public static string GetSystemSetting(string sOrgID, string sItemID)
        {
            var sSettingValue = string.Empty;
            if (!string.IsNullOrWhiteSpace(sOrgID) && !string.IsNullOrWhiteSpace(sItemID))
            {
                try
                {
                    var db = SugarBase.DB;
                    var oSet = db.Queryable<OTB_SYS_SystemSetting>().Single(it => it.OrgID == sOrgID && it.SettingItem == sItemID);
                    if (oSet != null)
                    {
                        sSettingValue = oSet.SettingValue;
                    }
                }
                catch (Exception ex)
                {
                    //写错误日志
                    ServiceTools.WriteLog(ServiceBase.Errorlog_Path, "Euro.Transfer.Common.GetSystemSetting(獲取系統設定) Error:" + ex.Message + " sOrgID:" + sOrgID + ";sItemID:" + sItemID, true);
                }
            }
            return sSettingValue;
        }

        #endregion GetSystemSetting

        #region PadRightEx

        /// <summary>
        /// </summary>
        /// <param name="str"></param>
        /// <param name="totalByteCount"></param>
        /// <param name="c"></param>
        /// <returns></returns>
        public static string PadRightEx(string str, int totalByteCount, char c)
        {
            var coding = Encoding.GetEncoding("gb2312");
            var dcount = 0;
            foreach (char ch in str.ToCharArray())
            {
                if (coding.GetByteCount(ch.ToString()) == 2)
                    dcount++;
            }
            var w = str.PadRight(totalByteCount - dcount, c);
            return w;
        }

        #endregion PadRightEx
    }

    /// <summary>
    /// 中文字符轉換工具
    /// </summary>
    public class ChineseStringUtility
    {
        private const int LOCALE_SYSTEM_DEFAULT = 0x0800;
        private const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000;
        private const int LCMAP_TRADITIONAL_CHINESE = 0x04000000;

        [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern int LCMapString(int Locale, int dwMapFlags, string lpSrcStr, int cchSrc, [Out] string lpDestStr, int cchDest);

        /// <summary>
        /// 将字符转换成简体中文
        /// </summary>
        /// <param name="source">输入要转换的字符串</param>
        /// <returns>转换完成后的字符串</returns>
        public static string ToSimplified(string source)
        {
            var target = new String(' ', source.Length);
            var ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, source, source.Length, target, source.Length);
            return target;
        }

        /// <summary>
        /// 将字符转换为繁体中文
        /// </summary>
        /// <param name="source">输入要转换的字符串</param>
        /// <returns>转换完成后的字符串</returns>
        public static string ToTraditional(string source)
        {
            var target = new String(' ', source.Length);
            var ret = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, source, source.Length, target, source.Length);
            return target;
        }
    }
}