using EasyBL.WebApi.Message;
using Entity.Sugar;
using log4net;
using SqlSugar.Base;
using System;
using System.Collections.Generic;
using System.Linq;

namespace EasyBL
{
    public class LogService : ServiceBase
    {
        public static readonly ILog mo_Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);//記錄異常

        /// <summary>
        /// (會計)取消審核
        /// </summary>
        /// <param name="i_crm">todo: describe i_crm parameter on ErrorMessage</param>
        /// <returns></returns>
        public new ResponseMessage ErrorMessage(RequestMessage i_crm)
        {
            ResponseMessage rm = null;
            string sMsg = null;
            try
            {
                var sErrorSource = _fetchString(i_crm, "ErrorSource");
                var sErrorlineNO = _fetchString(i_crm, "Errorlineno");
                var sErrorcolNO = _fetchString(i_crm, "Errorcolno");
                var sErrorMessage = _fetchString(i_crm, nameof(ErrorMessage));

                MailSend(sErrorMessage, null, i_crm.ORIGID, i_crm.USERID, "", "", "", sErrorSource, sErrorlineNO, sErrorcolNO);

                rm = new SuccessResponseMessage(null, i_crm);
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        public static void MailSend(string sErrorMessage, Exception Exception, string sOrgID, string sUserID, string sProgramId, string sProgramName, string sFunctionName, string sErrorSource, string sErrorlineNO, string sErrorcolNO)
        {
            LogService.mo_Log.Error(sProgramName + sFunctionName + " Error:" + sErrorMessage, Exception);

            var db = SugarBase.GetIntance();
            string sError = null;
            string sUserFromName = null;
            var sEmailBody = "";

            if (string.IsNullOrWhiteSpace(sProgramId))
            {
                //拆分JS錯誤來源網址
                var saErrorSource = sErrorSource.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
                sProgramId = saErrorSource.LastOrDefault();
            }
            if (string.IsNullOrWhiteSpace(sProgramName))
            {
                sProgramName = "";
            }
            if (string.IsNullOrWhiteSpace(sProgramName))
            {
                sFunctionName = "";
            }
            if (Exception != null)
            {
                sErrorMessage += "<br/>" + Exception.ToString();
            }

            //查詢工程師郵件,拆分維護工程師郵件
            var saEmails = Common.GetSystemSetting(db, sOrgID, "ErrorEngineer").Split(new string[] { ";", "," }, StringSplitOptions.RemoveEmptyEntries);
            //獲取Email郵件格式
            var oErrorMessage = db.Queryable<OTB_SYS_Email>().Single(it => it.OrgID == sOrgID && it.EmailID == nameof(ErrorMessage));

            if (oErrorMessage != null)
            {
                if (!string.IsNullOrWhiteSpace(sUserID))
                {
                    var oUserFrom = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == sOrgID && it.MemberID == sUserID);

                    if (oUserFrom != null)
                    {
                        sUserFromName = oUserFrom.MemberName;
                    }
                }

                //寄信開始
                foreach (string email in saEmails)
                {
                    //利用郵件獲取工程師ID和名稱
                    var oUserTo = db.Queryable<OTB_SYS_Members>().Single(it => it.OrgID == sOrgID && it.Email == email);

                    if (oUserTo == null)
                    {
                        oUserTo = new OTB_SYS_Members();
                    }
                    sEmailBody = oErrorMessage.BodyHtml.Replace("{{:UserName}}", oUserTo.MemberName)
                        .Replace("{{:UseMember}}", sUserFromName ?? sUserID)
                        .Replace("{{:FunctionName}}", sFunctionName)
                        .Replace("{{:ErrorRow}}", sErrorlineNO)
                        .Replace("{{:ErrorColumn}}", sErrorcolNO)
                        .Replace("{{:ProgramId}}", sProgramId)
                        .Replace("{{:ProgramName}}", sProgramName)
                        .Replace("{{:error}}", sErrorMessage);

                    var oEmail = new Emails();
                    var saEmailTo = new List<EmailTo>();   //收件人
                    var oEmailTo = new EmailTo
                    {
                        ToUserID = oUserTo.MemberID,
                        ToUserName = oUserTo.MemberName,
                        ToEmail = email,
                        Type = "to"
                    };
                    saEmailTo.Add(oEmailTo);

                    oEmail.FromUserName = "系統自動發送";//取fonfig
                    oEmail.Title = "奕達運通管理系統錯誤信息派送";//取fonfig
                    oEmail.EmailBody = sEmailBody;
                    oEmail.IsCCSelf = false;
                    oEmail.Attachments = null;
                    oEmail.EmailTo = saEmailTo;

                    var bSend = new MailService(sOrgID, true).MailFactory(oEmail, out sError);
                }
            }
        }
    }
}