using Mapster;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Users;
using Yi.Framework.AiHub.Application.Contracts.Dtos.Recharge;
using Yi.Framework.AiHub.Application.Contracts.IServices;
using Yi.Framework.AiHub.Domain.Entities;
using Yi.Framework.AiHub.Domain.Managers;
using Yi.Framework.AiHub.Domain.Shared.Consts;
using Yi.Framework.AiHub.Domain.Shared.Enums;
using Yi.Framework.Rbac.Application.Contracts.IServices;
using Yi.Framework.SqlSugarCore.Abstractions;

namespace Yi.Framework.AiHub.Application.Services
{
    public class RechargeService : ApplicationService, IRechargeService
    {
        private readonly ISqlSugarRepository<AiRechargeAggregateRoot> _repository;
        private readonly ICurrentUser _currentUser;
        private readonly IUserService _userService;
        private readonly IRoleService _roleService;
        private readonly AiRechargeManager _aiMessageManager;

        public RechargeService(
            ISqlSugarRepository<AiRechargeAggregateRoot> repository,
            ICurrentUser currentUser,
            IUserService userService, IRoleService roleService, AiRechargeManager aiMessageManager)
        {
            _repository = repository;
            _currentUser = currentUser;
            _userService = userService;
            _roleService = roleService;
            _aiMessageManager = aiMessageManager;
        }

        /// <summary>
        /// 查询已登录的账户充值记录（分页）
        /// </summary>
        /// <returns></returns>
        [Route("recharge/account")]
        [Authorize]
        public async Task<PagedResultDto<RechargeGetListOutput>> GetListByAccountAsync([FromQuery]RechargeGetListInput input)
        {
            var userId = CurrentUser.Id;
            RefAsync<int> total = 0;

            var entities = await _repository._DbQueryable
                .Where(x => x.UserId == userId)
                .WhereIF(input.StartTime.HasValue, x => x.CreationTime >= input.StartTime!.Value)
                .WhereIF(input.EndTime.HasValue, x => x.CreationTime <= input.EndTime!.Value)
                .WhereIF(input.IsFree == true, x => x.RechargeAmount == 0)
                .WhereIF(input.IsFree == false, x => x.RechargeAmount > 0)
                .WhereIF(input.MinRechargeAmount.HasValue, x => x.RechargeAmount >= input.MinRechargeAmount!.Value)
                .WhereIF(input.MaxRechargeAmount.HasValue, x => x.RechargeAmount <= input.MaxRechargeAmount!.Value)
                .OrderByDescending(x => x.CreationTime)
                .ToPageListAsync(input.SkipCount, input.MaxResultCount, total);

            var output = entities.Adapt<List<RechargeGetListOutput>>();
            return new PagedResultDto<RechargeGetListOutput>(total, output);
        }

        /// <summary>
        /// 给用户充值VIP
        /// </summary>
        /// <param name="input">充值输入参数</param>
        /// <returns></returns>
        [RemoteService(isEnabled:false)]
        public async Task RechargeVipAsync(RechargeCreateInput input)
        {
            DateTime? expireDateTime = null;

            // 计算总天数（1个月 = 31天）
            int totalDays = 0;
            if (input.Months.HasValue && input.Months.Value > 0)
            {
                totalDays += input.Months.Value * 31;
            }
            if (input.Days.HasValue && input.Days.Value > 0)
            {
                totalDays += input.Days.Value;
            }

            // 如果有天数，计算过期时间
            if (totalDays > 0)
            {
                // 直接查询该用户最大的过期时间
                var maxExpireTime = await _repository._DbQueryable
                    .Where(x => x.RechargeType == RechargeTypeEnum.Vip)
                    .Where(x => x.UserId == input.UserId && x.ExpireDateTime.HasValue)
                    .MaxAsync(x => x.ExpireDateTime);

                // 如果最大过期时间大于现在时间，从最大过期时间开始计算
                // 否则从当天开始计算
                DateTime baseDateTime = maxExpireTime.HasValue && maxExpireTime.Value > DateTime.Now
                    ? maxExpireTime.Value
                    : DateTime.Now;
                // 计算新的过期时间
                expireDateTime = baseDateTime.AddDays(totalDays);
            }
            // 如果总天数为0，表示永久VIP，ExpireDateTime保持为null

            // 创建充值记录
            var rechargeRecord = new AiRechargeAggregateRoot
            {
                UserId = input.UserId,
                RechargeAmount = input.RechargeAmount,
                Content = input.Content,
                ExpireDateTime = expireDateTime,
                Remark = input.Remark,
                ContactInfo = input.ContactInfo,
                RechargeType = RechargeTypeEnum.Vip
            };

            // 保存充值记录到数据库
            await _repository.InsertAsync(rechargeRecord);

            // 使用UserService给用户添加VIP角色
            await _userService.AddUserRoleByRoleCodeAsync(input.UserId,
                new List<string>() { AiHubConst.VipRole, "default" });
        }

        /// <summary>
        /// 移除用户vip及角色
        /// </summary>
        [RemoteService(isEnabled: false)]
        public async Task RemoveVipRoleByExpireAsync()
        {
            var expiredUserIds = await _aiMessageManager.RemoveVipByExpireAsync();
            if (expiredUserIds is not null)
            {
                await _roleService.RemoveUserRoleByRoleCodeAsync(expiredUserIds, AiHubConst.VipRole);
            }
        }
    }
}