using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;

namespace Edu.Common
{
    /// <summary>
    /// 全局配置
    /// </summary>
    public class Config
    {
        /// <summary>
        /// 配置文件注入
        /// </summary>
        public readonly static IConfiguration Configuration;
        static Config()
        {
            try
            {
                Configuration = new ConfigurationBuilder()
                .Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
                .Build();
            }
            catch (Exception ex)
            {
                Common.Plugin.LogHelper.Write(ex, "Config");
            }
        }

        /// <summary>
        /// 获取连接字符串
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string GetConnectionString(string key)
        {
            try
            {
                return Configuration.GetConnectionString(key);
            }
            catch
            {
                return "";
            }
        }


        /// <summary>
        /// 读取配置文件key的值
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string ReadConfigKey(string key, string subKey = "")
        {
            string valueStr = "";
            try
            {
                if (!string.IsNullOrWhiteSpace(subKey))
                {
                    valueStr = Configuration.GetSection(key)[subKey].ToString();
                }
                else
                {
                    valueStr = Configuration.GetSection(key).Value;
                }
            }
            catch
            {
            }
            return valueStr;
        }

        /// <summary>
        /// 异常日志保存路径
        /// </summary>
        public static string LogPath
        {
            get
            {
                string logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log/error");
                return logPath.ToString();
            }
        }

        /// <summary>
        /// 打印日志保存路径
        /// </summary>
        public static string InofLogPath
        {
            get
            {
                string logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log/info");
                return logPath.ToString();
            }
        }

        /// <summary>
        /// 接口请求日志保存路径
        /// </summary>
        public static string RequestLogPath
        {
            get
            {
                string logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log/request");
                return logPath.ToString();
            }
        }



      
        /// <summary>
        /// JWT加密秘钥
        /// </summary>
        public static string JwtSecretKey
        {
            get
            {
                return ReadConfigKey("JwtSecretKey");
            }
        }

        /// <summary>
        /// 过期时间,单位为秒
        /// </summary>
        public static int JwtExpirTime
        {
            get
            {
                Int32.TryParse(ReadConfigKey("JwtExpirTime"), out int JwtExpirTime);
                return JwtExpirTime;
            }
        }


        /// <summary>
        /// 教育前端url地址
        /// </summary>
        public static string EducationUrl
        {
            get
            {
                return ReadConfigKey("EducationUrl");
            }
        }
        

        /// <summary>
        /// 阿里云oss域名
        /// </summary>
        public static string GetOssFileUrl
        {
            get
            {
                return ReadConfigKey("ViewFileSiteUrl");
            }
        }

        public static string ErpViewFileSiteUrl
        {
            get
            {
                return ReadConfigKey("ErpViewFileSiteUrl");
            }
        }

        public static string ErpUrl
        {
            get
            {
                return ReadConfigKey("ErpUrl");
            }
        }

        /// <summary>
        /// 企业应用APP地址
        /// </summary>
        public static string WorkAPPDomain
        {
            get
            {
                return ReadConfigKey("WorkAPPDomain");
            }
        }

        /// <summary>
        /// 获取Oss文件全路径
        /// </summary>
        /// <param name="path">文件相对路径</param>
        /// <returns></returns>
        public static string GetFileUrl(string path)
        {
            if (string.IsNullOrWhiteSpace(path))
            {
                return null;
            }
            else
            {
                string p = @"(http|https)://(?<domain>[^(:|/]*)";
                Regex reg = new Regex(p, RegexOptions.IgnoreCase);
                string value = reg.Match(path).Value;
                if (!string.IsNullOrEmpty(value))
                {
                    return path;
                }
                else
                {
                    return GetOssFileUrl + path;
                }
            }
        }

        /// <summary>
        /// 获取URL参数
        /// </summary>
        /// <param name="url"></param>
        /// <param name="paraName"></param>
        /// <param name="isDecode"></param>
        /// <returns></returns>
        public static string GetParameterUrl(string url, string paraName, bool isDecode = false)
        {
            Regex re = new Regex(@"(^|&)?(\w+)=([^&]+)(&|$)?", RegexOptions.Compiled);
            MatchCollection mc = re.Matches(url);
            foreach (Match m in mc)
            {
                if (m.Result("$2").Equals(paraName))
                {
                    string paraResult = m.Result("$3");
                    if (isDecode)
                        return System.Web.HttpUtility.UrlDecode(paraResult);
                    else
                        return paraResult;
                }
            }
            return "";
        }


        /// <summary>
        /// 获取erp站点图片
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static string GetErpFileUrl(string path)
        {
            if (string.IsNullOrWhiteSpace(path))
            {
                return null;
            }
            else
            {
                string p = @"(http|https)://(?<domain>[^(:|/]*)";
                Regex reg = new Regex(p, RegexOptions.IgnoreCase);
                string value = reg.Match(path).Value;
                if (!string.IsNullOrEmpty(value))
                {
                    return path;
                }
                else
                {
                    return ErpViewFileSiteUrl + path;
                }
            }
        }

        /// <summary>
        /// 获取文件相对路径
        /// </summary>
        public static string GetFilePath(string path)
        {
            if (!string.IsNullOrWhiteSpace(path))
            {
                string p = @"(http|https)://(?<domain>[^(:|/]*)";
                Regex reg = new Regex(p, RegexOptions.IgnoreCase);
                string value = reg.Match(path).Value;
                if (!string.IsNullOrEmpty(value))
                {
                    Uri url = new Uri(path);
                    return url.AbsolutePath;
                }
                else
                {
                    return path;
                }
            }
            else
            {
                return path;
            }
        }

        /// <summary>
        /// 上传站点地址
        /// </summary>
        public static string UploadSiteUrl
        {
            get
            {
                return ReadConfigKey("UploadSiteUrl");
            }
        }

        /// <summary>
        /// 获取wkhtmltopdf路径
        /// </summary>
        public static string wkhtmltopdfConfig
        {
            get
            {
                return ReadConfigKey("WkHtmlToPdfPath");
            }
        }

        /// <summary>
        /// 上传文件预览站点
        /// </summary>
        public static string ViewFileSiteUrl
        {
            get
            {
                return ReadConfigKey("ViewFileSiteUrl");
            }
        }

        /// <summary>
        /// 获取虚拟目录
        /// </summary>
        public static string VirtualDirectory
        {
            get
            {
                return ReadConfigKey("VirtualDirectory");
            }
        }

        /// <summary>
        /// Mongo连接地址
        /// </summary>
        public static string Mongo
        {
            get
            {
                return ReadConfigKey("Mongo");
            }
        }

        /// <summary>
        /// 获取MongoDBName
        /// </summary>
        public static string MongoDBName
        {
            get
            {
                return ReadConfigKey("MongoDBName");
            }
        }

        /// <summary>
        /// 默认密码
        /// </summary>
        public static string DefaultPwd
        {
            get { return "123456"; }
        }

        /// <summary>
        /// 是否线上
        /// </summary>
        public static bool IsOnline
        {
            get
            {
                bool.TryParse(ReadConfigKey("IsOnline"), out bool _isOnline);
                return _isOnline;
            }
        }

        /// <summary>
        /// 是否发送短信
        /// </summary>
        public static int IsSendMsg
        {
            get
            {
                int.TryParse(ReadConfigKey("IsSendMsg"), out int _isSendMsg);
                return _isSendMsg;
            }
        }
        /// <summary>
        /// 导出文件保存路径
        /// </summary>
        public static string FileExportPath
        {
            get
            {
                string fileExportPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "/upfile/ExportFile");
                if (!Directory.Exists(fileExportPath))
                {
                    Directory.CreateDirectory(fileExportPath);
                }
                return fileExportPath;
            }
        }

        /// <summary>
        /// 退课流程编号
        /// </summary>
        public static int BackClassFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("BackClassFlowId"), out int BackClassFlowId);
                return BackClassFlowId;
            }
        }

        /// <summary>
        /// 调课流程编号
        /// </summary>
        public static int ChangeClassFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("ChangeClassFlowId"), out int ChangeClassFlowId);
                return ChangeClassFlowId;
            }
        }

        /// <summary>
        /// 停课流程编号
        /// </summary>
        public static int StopClassFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("StopClassFlowId"), out int StopClassFlowId);
                return StopClassFlowId;
            }
        }

        /// <summary>
        /// 临时上课邀请流程编号
        /// </summary>
        public static int TempInvitationClassFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("TempInvitationClassFlowId"), out int TempInvitationClassFlowId);
                return TempInvitationClassFlowId;
            }
        }


        /// <summary>
        /// 订单转班流程编号
        /// </summary>
        public static int OrderTransClassFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("OrderTransClassFlowId"), out int OrderTransClassFlowId);
                return OrderTransClassFlowId;
            }
        }


        /// <summary>
        /// 订单分拆流程编号
        /// </summary>
        public static int OrderSplitClassFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("OrderSplitClassFlowId"), out int OrderSplitClassFlowId);
                return OrderSplitClassFlowId;
            }
        }
        /// <summary>
        /// 学生请假流程编号
        /// </summary>
        public static int StudentLeaveFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("StudentLeaveFlowId"), out int StudentLeaveFlowId);
                return StudentLeaveFlowId;
            }
        }

        /// <summary>
        /// 组卷审批流程编号
        /// </summary>
        public static int ZuJuanFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("ZuJuanFlowId"), out int ZuJuanFlowId);
                return ZuJuanFlowId;
            }
        }

        

        /// <summary>
        /// 考试申请流程编号
        /// </summary>
        public static int ExamApplyFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("ExamApplyFlowId"), out int ExamApplyFlowId);
                return ExamApplyFlowId;
            }
        }

        /// <summary>
        /// 投稿审批流程编号
        /// </summary>
        public static int ContributeFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("ContributeFlowId"), out int ContributeFlowId);
                return ContributeFlowId;
            }
        }

        /// <summary>
        /// VIP课程申请流程编号
        /// </summary>
        public static int VipCourseFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("VipCourseFlowId"), out int VipCourseFlowId);
                return VipCourseFlowId;
            }
        }

        /// <summary>
        /// 教师考核审批流程Id
        /// </summary>
        public static int TeacherAssessmentFlowId
        {
            get
            {
                int.TryParse(ReadConfigKey("TeacherAssessmentFlowId"), out int TeacherAssessmentFlowId);
                return TeacherAssessmentFlowId;
            }
        }


        /// <summary>
        /// okr关注事项配置
        /// </summary>
        public static string OKRMatterValue
        {
            get
            {
                return ReadConfigKey("OKRMatterValue");
            }
        }

        /// <summary>
        /// 分区校长岗位编号
        /// </summary>
        public static int SchoolPostId
        {
            get
            {
                int.TryParse(ReadConfigKey("SchoolPostId"), out int SchoolPostId);
                return SchoolPostId;
            }
        }

        /// <summary>
        /// 教务长岗位编号
        /// </summary>
        public static int JiaoWuZhang
        {
            get
            {
                int.TryParse(ReadConfigKey("JiaoWuZhang"), out int JiaoWuZhang);
                return JiaoWuZhang;
            }
        }

        /// <summary>
        /// 数字选择题前缀符号
        /// </summary>
        public static string NumberQuestionChar
        {
            get
            {
                return "@";
            }
        }

        /// <summary>
        /// 留学就业部门主管审核编号
        /// </summary>
        public static int StudyAbroadDirectorId
        {
            get
            {
                int.TryParse(ReadConfigKey("StudyAbroadDirectorId"), out int studyAbroadDirectorId);
                return studyAbroadDirectorId;
            }
        }

        /// <summary>
        /// 留学就业部门负责人审核编号
        /// </summary>
        public static int StudyAbroadManagerId
        {
            get
            {
                int.TryParse(ReadConfigKey("StudyAbroadManagerId"), out int studyAbroadManagerId);
                return studyAbroadManagerId;
            }
        }

        /// <summary>
        /// 获取合同默认抬头
        /// </summary>
        public static string ContractDefaultTitle
        {
            get
            {
                return ReadConfigKey("ContractDefaultTitle");
            }
        }

        /// <summary>
        /// 是否推送消息
        /// </summary>
        public static int IsPushMessage
        {
            get
            {
                int.TryParse(ReadConfigKey("IsPushMessage"), out int IsPushMessage);
                return IsPushMessage;
            }
        }

        /// <summary>
        /// 超过下班时间多少分钟数不能打卡
        /// </summary>
        public static int MoreThanMinutes
        {
            get
            {
                int.TryParse(ReadConfigKey("MoreThanMinutes"), out int MoreThanMinutes);
                return MoreThanMinutes;
            }
        }

        /// <summary>
        /// 连续缺课多少课时
        /// </summary>
        public static int AbsentHours
        {
            get
            {
                int.TryParse(ReadConfigKey("AbsentHours"), out int AbsentHours);
                if (AbsentHours == 0)
                {
                    AbsentHours = 12;
                }
                return AbsentHours;
            }
        }

        /// <summary>
        /// 消息推送AppId
        /// </summary>
        public static string PushAppId
        {
            get
            {
                return ReadConfigKey("PushAppId");
            }
        }


        /// <summary>
        /// 收入单据
        /// </summary>
        public static string IncomeFinanceApi
        {
            get
            {
                return ReadConfigKey("IncomeFinanceApi");
            }
        }
        /// <summary>
        /// 微信结算率
        /// </summary>
        public static string SettlementRate
        {
            get
            {
                return ReadConfigKey("SettlementRate");
            }
        }

        /// <summary>
        /// 销售发放提成的前提比例
        /// </summary>
        public static string SellCommissionFFBL
        {
            get
            {
                return ReadConfigKey("SellCommissionFFBL");
            }
        }

        /// <summary>
        /// 收入请求加密
        /// </summary>
        public static string FinanceKey
        {
            get
            {
                return ReadConfigKey("FinanceKey");
            }
        }
        /// <summary>
        /// 微信支付成功回调地址
        /// </summary>
        public static string sTenpayNotifyUrl
        {
            get
            {
                return ReadConfigKey("sTenpayNotifyUrl");
            }
        }
        /// <summary>
        /// 微信退款成功回调地址
        /// </summary>
        public static string sTenpayNotifyRefundUrl
        {
            get
            {
                return ReadConfigKey("sTenpayNotifyRefundUrl");
            }
        }


        /// <summary>
        /// 甲鹤教育接口请求地址
        /// </summary>
        public static string DmcMallApi
        {
            get
            {
                return ReadConfigKey("DmcMallApi");
            }
        }


        /// <summary>
        /// 甲鹤教育商户id
        /// </summary>
        public static string JHTenantId
        {
            get
            {
                return ReadConfigKey("JHTenantId");
            }
        }

        //JHMallUserOpenId
        /// <summary>
        /// 甲鹤教育固定用户OpenId
        /// </summary>
        public static string JHMallUserOpenId
        {
            get
            {
                return ReadConfigKey("JHMallUserOpenId");
            }
        }


        /// <summary>
        /// 甲鹤教育小程序id
        /// </summary>
        public static string JHMallBaseId
        {
            get
            {
                return ReadConfigKey("JHMallBaseId");
            }
        }

        /// <summary>
        /// 电商加密
        /// </summary>
        public static string MallJwtSecretKey
        {
            get
            {
                return ReadConfigKey("MallJwtSecretKey");
            }
        }

        /// <summary>
        /// 值班日期验证
        /// </summary>
        public static DateTime DutyDate
        {
            get
            {
                DateTime.TryParse(ReadConfigKey("DutyDate"), out DateTime dt);
                return dt;
            }
        }

        /// <summary>
        /// 获取字母排序
        /// </summary>
        public static string ClassNoLetterStr
        {
            get
            {
                return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            }
        }

        /// <summary>
        /// 公告字典中的key
        /// </summary>
        public static string Notice_BaseKey
        {
            get
            {
                return ReadConfigKey("Notice_BaseKey");
            }
        }

        /// <summary>
        /// 合同功能菜单code(学管)
        /// </summary>
        public static string EducationContractSchool
        {
            get
            {
                return ReadConfigKey("EducationContractSchool");
            }
        }


        /// <summary>
        /// 合同功能菜单code(行政)
        /// </summary>
        public static string EducationContractAdmin
        {
            get
            {
                return ReadConfigKey("EducationContractAdmin");
            }
        }

        /// <summary>
        /// 是否开启调课验证
        /// </summary>
        public static int IsOpenChangeClassVerify
        {
            get
            {
                int.TryParse(ReadConfigKey("IsOpenChangeClassVerify"), out int IsOpenChangeClassVerify);
                return IsOpenChangeClassVerify;
            }
        }

        /// <summary>
        /// 甲鹤小程序AppId
        /// </summary>
        public static string AppID
        {
            get { return "wx38e054ee42b054f4"; }
        }

        /// <summary>
        /// 甲小鹤AppId
        /// </summary>
        public static string JiaXiaoHeAppId {
            get { return "wx0f4b451960f8ef29"; }
        }

        /// <summary>
        /// 甲小鹤AppSecret
        /// </summary>
        public static string JiaXiaoHeAppSecret
        {
            get { return "62332ef58d16280fc05613fc61ecff1d"; }
        }

        /// <summary>
        /// 甲鹤小程序AppSecret
        /// </summary>
        public static string AppSecret
        {
            get { return "d3ad4699265ba885ae2c8b65bf574ea5"; }
        }

        /// <summary>
        /// 微信小程序Api地址
        /// </summary>
        public static string WechatApi
        {
            get { return "https://api.weixin.qq.com/"; }
        }

        /// <summary>
        /// 是否是本地服务器
        /// </summary>
        public static int IsLocal
        {
            get
            {
                Int32.TryParse(ReadConfigKey("IsLocal"), out int _IsLocal);
                return _IsLocal;
            }
        }

        /// <summary>
        /// 临时访问小程序二维码Token
        /// </summary>
        public static string TempToken
        {
            get
            {
                return ReadConfigKey("TempToken");
            }
        }


        /// <summary>
        /// 公众号的AppId
        /// </summary>
        public static string WeChatAccountAppId
        {
            get
            {
                return ReadConfigKey("WeChatAccountAppId");
            }
        }

        /// <summary>
        /// 公众号的AppSecret
        /// </summary>
        public static string WeChatAccountAppSecret
        {
            get
            {
                return ReadConfigKey("WeChatAccountAppSecret");
            }
        }

        /// <summary>
        /// 新业绩提成启用时间
        /// </summary>
        public static string NewAchievementsEnable
        {
            get
            {
                return ReadConfigKey("NewAchievementsEnable");
            }
        }

        /// <summary>
        /// 不验证学员状态,就可以签到的订单
        /// </summary>
        public static List<int> NoCheckOrderList
        {
            get
            {
                List<int> list = new List<int>();
                try
                {
                    string noCheckOrdersStr = ReadConfigKey("NoCheckOrders");
                    if (!string.IsNullOrEmpty(noCheckOrdersStr))
                    {
                        list = Common.ConvertHelper.StringToList(noCheckOrdersStr);
                    }
                }
                catch
                {
                    list = new List<int>();
                }
                return list;
            }
        }

        /// <summary>
        /// 需要清零的学员订单编号
        /// </summary>
        public static List<int> FinishOrderIdList
        {
            get
            {
                List<int> list = new List<int>();
                try
                {
                    string noCheckOrdersStr = ReadConfigKey("FinishOrderIds");
                    if (!string.IsNullOrEmpty(noCheckOrdersStr))
                    {
                        list = Common.ConvertHelper.StringToList(noCheckOrdersStr);
                    }
                }
                catch
                {
                    list = new List<int>();
                }
                return list;
            }
        }
    }
}