using AMESCoreStudio.CommonTools.Result;
using AMESCoreStudio.WebApi.Models.BAS;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;
using System;
using System.Net.Mail;
using Microsoft.Extensions.Configuration;
using System.Net;
using System.Linq;
using System.Text.RegularExpressions;
using System.IO;

namespace AMESCoreStudio.WebApi.Controllers.BLL
{
    /// <summary>
    /// Mail 寄信
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class MailController : Controller
    {
        private readonly AMESContext _context;
        private readonly IConfiguration _config;

        /// <summary>
        /// 建構式
        /// </summary>
        /// <param name="context"></param>
        public MailController(AMESContext context, IConfiguration config)
        {
            _config = config;
            _context = context;
        }

        /// <summary>
        /// Mail 寄信
        /// </summary>
        /// <param name="Subject">Mail主旨</param>
        /// <param name="Body">Mail內容</param>
        /// <param name="ToMailGroup">群組(,區分多組)</param>
        /// <param name="ToMail">EMail(,區分多組)</param>
        /// <param name="ToCC">是否為密件</param>
        /// <param name="Attachment">附件</param>
        /// <returns></returns>
        [HttpPost("ToMail")]
        public async Task<ResultModel<dynamic>> PostMail(string Subject, string Body, string ToMailGroup, string ToMail, bool ToCC = false, string Attachment = null)
        {
            ResultModel<dynamic> result = new ResultModel<dynamic>();

            // Mail 基本設定資料
            string mailFrom = _config.GetSection("MailFrom").Value;
            string mailSmtpServer = _config.GetSection("MailSmtpServer").Value;
            int mailSmtpPort = int.Parse(_config.GetSection("MailSmtpPort").Value);
            string mailUser = _config.GetSection("MailUser").Value;
            string mailPassword = _config.GetSection("MailUserPassword").Value;

            MailMessage mesMail = new MailMessage();
            mesMail.From = new MailAddress(mailFrom);
            mesMail.Subject = Subject;
            mesMail.SubjectEncoding = System.Text.Encoding.UTF8;
            mesMail.Body = Body;
            mesMail.IsBodyHtml = true;
            mesMail.BodyEncoding = System.Text.Encoding.UTF8;
            // 判斷是否加密
            if (ToCC)
            {
                #region 判斷群組 
                if (!string.IsNullOrWhiteSpace(ToMailGroup))
                {
                    var mailGroups = ToMailGroup.Split(',');
                    foreach (var mailG in mailGroups)
                    {
                        var q = from a in _context.MailGroups
                                where a.GroupNo.ToUpper() == mailG.ToUpper()
                                join b in _context.MailGroupDetails on a.GroupID equals b.GroupID
                                join c in _context.UserInfoes on b.UserID equals c.UserID
                                select new
                                {
                                    b.UserID,
                                    c.UserName,
                                    c.UserEMail
                                };

                        foreach (var userMail in await q.ToListAsync())
                        {
                            if (!string.IsNullOrWhiteSpace(userMail.UserEMail))
                            {
                                mesMail.CC.Add(new MailAddress(userMail.UserEMail));
                            }
                        }
                    }

                }
                #endregion

                #region 個人 
                if (!string.IsNullOrWhiteSpace(ToMail))
                {
                    var mails = ToMail.Split(',');
                    foreach (var mail in mails)
                    {
                        mesMail.CC.Add(new MailAddress(mail));
                    }

                }
                #endregion 
            }
            else
            {
                #region 判斷群組 
                if (!string.IsNullOrWhiteSpace(ToMailGroup))
                {
                    var mailGroups = ToMailGroup.Split(',');
                    foreach (var mailG in mailGroups)
                    {
                        var q = from a in _context.MailGroups
                                where a.GroupNo.ToUpper() == mailG.ToUpper()
                                join b in _context.MailGroupDetails on a.GroupID equals b.GroupID
                                join c in _context.UserInfoes on b.UserID equals c.UserID
                                select new
                                {
                                    b.UserID,
                                    c.UserName,
                                    c.UserEMail
                                };

                        foreach (var userMail in await q.ToListAsync())
                        {
                            if (!string.IsNullOrWhiteSpace(userMail.UserEMail))
                            {
                                mesMail.To.Add(new MailAddress(userMail.UserEMail));
                            }
                        }
                    }

                }
                #endregion

                #region 個人 
                if (!string.IsNullOrWhiteSpace(ToMail))
                {
                    var mails = ToMail.Split(',');
                    foreach (var mail in mails)
                    {
                        mesMail.To.Add(new MailAddress(mail));
                    }

                }
                #endregion
            }

            // 是否有附件檔案
            if (!string.IsNullOrWhiteSpace(Attachment))
            {
                mesMail.Attachments.Add(new Attachment(Attachment));
            }

            SmtpClient mailClient = new SmtpClient(mailSmtpServer, mailSmtpPort);

            //mailClient.EnableSsl = true;
            NetworkCredential nc = new NetworkCredential();
            nc.UserName = mailUser;
            nc.Password = mailPassword;


            try
            {
                mailClient.Credentials = nc;
                mailClient.Send(mesMail);
                result.Success = true;
                result.Msg = "寄信成功";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = "寄信失敗,錯誤:" + ex.InnerException.Message;
            }
            return result;

        }

        /// <summary>
        /// 用ID获取该單位资料
        /// </summary>
        /// <returns></returns>
        // GET: api/FactoryUnits/5
        [HttpGet]
        public async Task<string> GetFactoryUnit()
        {
            // Mail 基本設定資料
            string mailFrom = _config.GetSection("MailFrom").Value;
            string mailSmtpServer = _config.GetSection("MailSmtpServer").Value;
            int mailSmtpPort = int.Parse(_config.GetSection("MailSmtpPort").Value);
            string mailUser = _config.GetSection("MailUser").Value;
            string mailPassword = _config.GetSection("MailUserPassword").Value;

            var aa = $"{mailFrom} {mailSmtpServer} {mailSmtpPort} {mailUser} {mailPassword}";

            return aa;
        }
    }
}