using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infrastructure;
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IRaCIS.Core.Application.Service
{
    public class VerifyCodeHelper
    {


        public static async Task<bool> VerifyUserCodeAsync(IRepository<VerificationCode> _verificationCodeRepository, EmailVerifyCodeType verifyCodeType, string email, string code)
        {
            return await VerifyUserCodeAsync(_verificationCodeRepository, verifyCodeType, null, email, code);
        }

        public static async Task<bool> VerifyUserCodeAsync(IRepository<VerificationCode> _verificationCodeRepository, EmailVerifyCodeType verifyCodeType, Guid identityUserId, string code)
        {
            return await VerifyUserCodeAsync(_verificationCodeRepository, verifyCodeType, identityUserId, null, code);
        }

        public static async Task<bool> VerifyUserCodeAsync(IRepository<VerificationCode> _verificationCodeRepository, EmailVerifyCodeType verifyCodeType, Guid? identityUserId, string? email, string code)
        {

            var verifySuccess = false;

            var verificationRecord = new VerificationCode();


            if (identityUserId != null)
            {
                verificationRecord = await _verificationCodeRepository.FirstOrDefaultAsync(t => t.UserId == identityUserId && t.Code == code && t.CodeType == 0);

                if (verificationRecord != null)
                {
                    //删除验证码历史记录
                    await _verificationCodeRepository.BatchDeleteNoTrackingAsync(t => t.UserId == identityUserId && t.CodeType == 0);


                    if (email != null)
                    {
                        var useEmail = email.Trim();

                        if (verificationRecord.EmailOrPhone.Trim() != useEmail)
                        {
                            //发送验证嘛的和提交的邮箱不一致

                            throw new BusinessValidationFailedException(I18n.T("User_VerificationEmailNotSameWithBefore"));

                        }
                    }
                }
            }
            else if (email != null)
            {

                var useEmail = email.Trim();

                verificationRecord = await _verificationCodeRepository.FirstOrDefaultAsync(t => t.EmailOrPhone == useEmail && t.Code == code && t.CodeType == 0);

                if (verificationRecord != null)
                {                  
                    //删除验证码历史记录
                    await _verificationCodeRepository.BatchDeleteNoTrackingAsync(t => t.EmailOrPhone == useEmail && t.CodeType == 0);
                }

            }
            else
            {
                throw new InvalidOperationException("验证码参数不正确");
            }

            //检查数据库是否存在该验证码
            if (verificationRecord == null)
            {
                //---验证码错误。

                throw new BusinessValidationFailedException(I18n.T("User_VerificationCodeError"));

            }
            else
            {
                //检查验证码是否失效
                if (verificationRecord.ExpirationTime < DateTime.Now)
                {
                    //---验证码已经过期。

                    throw new BusinessValidationFailedException(I18n.T("User_VerificationCodeExpired"));

                }
                else //验证码正确 并且 没有超时 
                {
                    verifySuccess = true;


                }
            }

            return verifySuccess;
        }


    }
}