using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using MailKit.Security;
using MimeKit;

namespace IRaCIS.Application.Services
{
    public interface IMailVerificationService
    {
        Task SendMail(Guid userId, string userName, string emailAddress, int verificationCode);

        Task AnolymousSendEmail(string researchProgramNo ,string emailAddress, int verificationCode);

        Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode);

         Task AnolymousSendEmailForResetAccount( string emailAddress, int verificationCode);
    }

    public class MailVerificationService : IMailVerificationService
    {
        private readonly IRepository<VerificationCode> _verificationCodeRepository;

        private readonly IRepository<SystemBasicData> _systemBasicDatarepository;


        public MailVerificationService(IRepository<VerificationCode> verificationCodeRepository, IRepository<SystemBasicData> systemBasicDatarepository)
        {
            _verificationCodeRepository = verificationCodeRepository;
            _systemBasicDatarepository = systemBasicDatarepository;

        }


        public async Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode)
        {


            var messageToSend = new MimeMessage();
            //发件地址
            messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
            //收件地址
            messageToSend.To.Add(new MailboxAddress(userName, emailAddress));
            //主题
            messageToSend.Subject = "重置邮箱";

            messageToSend.Body = new TextPart("plain")
            {
                Text = $@"  {userName}，您好：
                            感谢您使用展影云平台。
                        您正在进行邮箱重置操作，验证码是： {verificationCode}，请在3分钟内输入该验证码，进行后续操作。如非本人操作，请忽略该邮件
                            此邮件属系统自动发出，无需回复。
                        上海展影医疗科技有限公司"
            };
            using (var smtp = new MailKit.Net.Smtp.SmtpClient())
            {
                smtp.MessageSent += (sender, args) =>
                {
                    // args.Response 
                    var code = verificationCode.ToString();
                    _ = _verificationCodeRepository.AddAsync(new VerificationCode()
                    {
                        CodeType = 0,
                        HasSend = true,
                        Code = code,
                        UserId = userId,
                        ExpirationTime = DateTime.Now.AddMinutes(3)
                    }).Result;
                    _ = _verificationCodeRepository.SaveChangesAsync().Result;

                };

                smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;

                await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls);

                await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH");

                await smtp.SendAsync(messageToSend);

                await smtp.DisconnectAsync(true);

            }
        }

        public async Task AnolymousSendEmailForResetAccount( string emailAddress, int verificationCode)
        {
            var messageToSend = new MimeMessage();
            //发件地址
            messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
            //收件地址
            messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress));
            //主题
            messageToSend.Subject = "重置密码";

            messageToSend.Body = new TextPart("plain")
            {
                Text = $@"  您好：
                            感谢您使用展影云平台。
                        您正在进行邮箱重置密码操作，验证码是： {verificationCode}，请在3分钟内输入该验证码，进行后续操作。如非本人操作，请忽略该邮件
                            此邮件属系统自动发出，无需回复。
                        上海展影医疗科技有限公司"
            };
            using (var smtp = new MailKit.Net.Smtp.SmtpClient())
            {
                smtp.MessageSent += (sender, args) =>
                {
                    // args.Response 
                    var code = verificationCode.ToString();
                    _ = _verificationCodeRepository.AddAsync(new VerificationCode()
                    {
                        CodeType = Core.Domain.Share.VerifyType.Email,
                        HasSend = true,
                        Code = code,
                        UserId = Guid.Empty,//此时不知道用户
                        EmailOrPhone = emailAddress,
                        ExpirationTime = DateTime.Now.AddMinutes(3)
                    }).Result;
                    _ = _verificationCodeRepository.SaveChangesAsync().Result;

                };

                smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;

                await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls);

                await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH");

                await smtp.SendAsync(messageToSend);

                await smtp.DisconnectAsync(true);
            }
        }


        public async Task AnolymousSendEmail(string researchProgramNo,string emailAddress, int verificationCode)
        {


            var messageToSend = new MimeMessage();
            //发件地址
            messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
            //收件地址
            messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress));
            //主题
            messageToSend.Subject = $"[{researchProgramNo}]中心调研";

            messageToSend.Body = new TextPart("plain")
            {
                Text = $@"   感谢您使用展影云平台。
                             您正在参与展影医疗IRC项目中心调研工作，验证码是：: {verificationCode}，请在3分钟内输入该验证码，进行后续操作。如非本人操作，请忽略该邮件。
                             此邮件属系统自动发出，无需回复。
                         上海展影医疗科技有限公司"
            };
            using (var smtp = new MailKit.Net.Smtp.SmtpClient())
            {
                smtp.MessageSent += (sender, args) =>
               {
                   // args.Response 
                   var code = verificationCode.ToString();
                   _ = _verificationCodeRepository.AddAsync(new VerificationCode()
                   {
                       CodeType = VerifyType.Email,
                       HasSend = true,
                       Code = code,
                       UserId = Guid.Empty,//此时不知道用户
                       EmailOrPhone = emailAddress,
                       ExpirationTime = DateTime.Now.AddMinutes(3)
                   }).Result;
                   _ = _verificationCodeRepository.SaveChangesAsync().Result;

               };

                smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;

                await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls);

                await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH");

                await smtp.SendAsync(messageToSend);

                await smtp.DisconnectAsync(true);
            }
        }





        public async Task SendMail(Guid userId, string userName, string emailAddress, int verificationCode)
        {


            var messageToSend = new MimeMessage();
            //发件地址
            messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
            //收件地址
            messageToSend.To.Add(new MailboxAddress(userName, emailAddress));
            //主题
            messageToSend.Subject = "Reset PassWord (Verification Code)";

            messageToSend.Body = new TextPart("plain")
            {
                Text = $@"Hey {userName},you are resetting your password via email. The verification code is: {verificationCode}, which is valid within 3 minutes. If it is not your own operation, please ignore it! 

                                                                                                                -- GRR"
            };
            using (var smtp = new MailKit.Net.Smtp.SmtpClient())
            {
                smtp.MessageSent += (sender, args) =>
                {
                    // args.Response 
                    var code = verificationCode.ToString();
                    _ = _verificationCodeRepository.AddAsync(new VerificationCode()
                    {
                        CodeType = 0,
                        HasSend = true,
                        Code = code,
                        UserId = userId,
                        ExpirationTime = DateTime.Now.AddMinutes(3)
                    }).Result;
                    _ = _verificationCodeRepository.SaveChangesAsync().Result;

                };

                smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;

                await smtp.ConnectAsync("smtp.163.com", 25, SecureSocketOptions.StartTls);

                await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH");

                await smtp.SendAsync(messageToSend);

                await smtp.DisconnectAsync(true);

            }
        }


    }
}