using IRaCIS.Application.Interfaces;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Domain.Share;
using Nito.AsyncEx;

namespace IRaCIS.Application.Services
{
    [ApiExplorerSettings(GroupName = "Institution")]
    public class SiteService : BaseService, ISiteService
    {
        private readonly IRepository<Site> _siteRepository;
        private readonly IRepository<TrialSiteUser> _trialSiteUserRepository;

        private readonly AsyncLock _mutex = new AsyncLock();

        public SiteService(IRepository<Site> siteRepository, IRepository<TrialSiteUser> trialSiteUserRepository)
        {
            _siteRepository = siteRepository;
            this._trialSiteUserRepository = trialSiteUserRepository;
        }

        /// <summary> 分页获取研究中心列表 </summary>
        [HttpPost]
        public async Task<PageOutput<SiteSelectDTO>> GetSiteList(SiteQueryParam searchModel)
        {

            var siteQueryable = _siteRepository
                   .WhereIf(!string.IsNullOrWhiteSpace(searchModel.SiteName), t => t.SiteName.Contains(searchModel.SiteName))
                   .WhereIf(!string.IsNullOrWhiteSpace(searchModel.AliasName), t => t.AliasName.Contains(searchModel.AliasName))
                   .WhereIf(!string.IsNullOrWhiteSpace(searchModel.City), t => t.City.Contains(searchModel.City))
                   .WhereIf(!string.IsNullOrWhiteSpace(searchModel.Country), t => t.Country.Contains(searchModel.Country))
                   .ProjectTo<SiteSelectDTO>(_mapper.ConfigurationProvider);


            return await siteQueryable.ToPagedListAsync(searchModel.PageIndex, searchModel.PageSize, string.IsNullOrWhiteSpace(searchModel.SortField) ? "SiteName" : searchModel.SortField, searchModel.Asc);


        }

        public async Task<IEnumerable<SiteSelectionDTO>> GetAllSiteList()
        {
            return await _siteRepository.ProjectTo<SiteSelectionDTO>(_mapper.ConfigurationProvider).ToListAsync();
        }


        /// <summary> 添加研究中心 </summary>

        public async Task<IResponseOutput> AddOrUpdateSite(SiteCommand siteCommand)
        {

            var exp = new EntityVerifyExp<Site>()
            {
                VerifyExp = h => h.SiteName.Equals(siteCommand.SiteName) || h.SiteCode.Equals(siteCommand.SiteCode),
                VerifyMsg = "已经存在同名的中心，请确认。"
            };

            using (await _mutex.LockAsync())
            {
                if (siteCommand.Id == null)
                {

                    siteCommand.Code = await _siteRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1;

                    siteCommand.SiteCode = AppSettings.GetCodeStr(siteCommand.Code, nameof(User));
                }

                var site = await _siteRepository.InsertOrUpdateAsync(siteCommand, true, exp);

                return ResponseOutput.Ok(site.Id.ToString());

            }






        }

        /// <summary> 删除研究中心 </summary>

        [HttpDelete("{siteId:guid}")]
        public async Task<IResponseOutput> DeleteSite(Guid siteId)
        {

            if (await _trialSiteUserRepository.AnyAsync(t => t.SiteId == siteId))
            {
                return ResponseOutput.NotOk("该中心已经加入项目，不可以被删除。");
            }

            var success = await _siteRepository.BatchDeleteNoTrackingAsync(x => x.Id == siteId);
            return ResponseOutput.Result(success);
        }
    }
}