using AutoMapper;
using AutoMapper.QueryableExtensions;
using IRaCIS.Core.Infrastructure.ExpressionExtend;
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Mvc;
using Panda.DynamicWebApi.Attributes;

namespace IRaCIS.Application.Services
{
    [ ApiExplorerSettings(GroupName = "Financial")]
    public class VolumeRewardService : BaseService, IVolumeRewardService
    {
        private readonly IRepository<VolumeReward> _volumeRewardRepository;
        

        public VolumeRewardService(IRepository<VolumeReward> volumeRewardRepository,IMapper mapper)
        {
            _volumeRewardRepository = volumeRewardRepository;
            
        }
        /// <summary>
        /// 批量添加或更新奖励费用单价
        /// </summary>
        [NonDynamicMethod]
        public async Task<IResponseOutput> AddOrUpdateVolumeRewardPriceList(IEnumerable<AwardPriceCommand> addOrUpdateModel)
        {
            await  _volumeRewardRepository.BatchDeleteNoTrackingAsync(t => t.Id != Guid.Empty);
            var temp = _mapper.Map<List<VolumeReward>>(addOrUpdateModel);
           
            await _volumeRewardRepository.AddRangeAsync(temp);
            var success = await _volumeRewardRepository.SaveChangesAsync();

            return ResponseOutput.Result(success);
        }


        /// <summary>
        /// 获取所有奖励单价列表-用于计算时,一次性获取所有
        /// </summary>
        [NonDynamicMethod]
        public async Task<List<AwardPriceCalculateDTO>> GetVolumeRewardPriceList()
        {
            return await _volumeRewardRepository.ProjectTo<AwardPriceCalculateDTO>(_mapper.ConfigurationProvider).OrderBy(t => t.Min).ToListAsync();
        }

        /// <summary>
        /// 分页获取奖励单价列表
        /// </summary>
        [HttpPost]
        public async Task<PageOutput<AwardPriceDTO>> GetVolumeRewardPriceList(AwardPriceQueryDTO queryParam)
        {
            var awardPriceQueryable = _volumeRewardRepository.ProjectTo<AwardPriceDTO>(_mapper.ConfigurationProvider);

            return await awardPriceQueryable.ToPagedListAsync(queryParam.PageIndex, queryParam.PageSize, "Min");
          
        }
    }
}