//--------------------------------------------------------------------
//     此代码由T4模板自动生成  byzhouhang 20210918
//	   生成时间 2022-04-25 09:46:43 
//     对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.ViewModel;
using Microsoft.AspNetCore.Mvc;
namespace IRaCIS.Core.Application.Service
{
    /// 
    /// SystemNoticeService
    /// 	
    [ApiExplorerSettings(GroupName = "Management")]
    public class SystemNoticeService(IRepository _systemNoticeRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ISystemNoticeService
    {
        [HttpPost]
        public async Task> GetSystemNoticeList(SystemNoticeQuery inQuery)
        {
            //防止生成sql生成GETDATE() 时区导致的问题
            var appDateTimeNow = DateTime.Now;
            var systemNoticeQueryable = _systemNoticeRepository
                .WhereIf(inQuery.ApplicableProjectEnum != null, t => t.ApplicableProjectEnum == inQuery.ApplicableProjectEnum)
                .WhereIf(inQuery.NoticeLevelEnum != null, t => t.NoticeLevelEnum == inQuery.NoticeLevelEnum)
                .WhereIf(inQuery.NoticeModeEnum != null, t => t.NoticeModeEnum == inQuery.NoticeModeEnum)
                .WhereIf(inQuery.NoticeStateEnum != null && inQuery.NoticeStateEnum != Domain.Share.SystemNotice_NoticeStateEnum.HaveExpired, t => t.NoticeStateEnum == inQuery.NoticeStateEnum)
               .WhereIf(inQuery.NoticeModeEnum != null && inQuery.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.HaveExpired, t => t.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.HavePublished && t.EndDate != null && t.EndDate < appDateTimeNow)
               .WhereIf(inQuery.NoticeTypeEnum != null, t => t.NoticeTypeEnum == inQuery.NoticeTypeEnum)
                .WhereIf(!string.IsNullOrWhiteSpace(inQuery.FileName), t => t.FileName.Contains(inQuery.FileName))
                .WhereIf(!string.IsNullOrWhiteSpace(inQuery.NoticeContent), t => t.NoticeContent.Contains(inQuery.NoticeContent))
            .ProjectTo(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken });
            return await systemNoticeQueryable.ToPagedListAsync(inQuery);
        }
        public async Task AddOrUpdateSystemNotice(SystemNoticeAddOrEdit addOrEditSystemNotice)
        {
            if (addOrEditSystemNotice.Id == null)
            {
                var entity = await _systemNoticeRepository.InsertFromDTOAsync(addOrEditSystemNotice);
                if (entity.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.HavePublished)
                {
                    entity.PublishedUserId = _userInfo.UserRoleId;
                    entity.PublishedTime = DateTime.Now;
                }
                await _systemNoticeRepository.SaveChangesAsync();
                return ResponseOutput.Ok(entity.Id.ToString());
            }
            else
            {
                var systemNotice = (await _systemNoticeRepository.Where(t => t.Id == addOrEditSystemNotice.Id, true, true).Include(t => t.NoticeUserTypeList).FirstOrDefaultAsync()).IfNullThrowException();
                if (addOrEditSystemNotice.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.HavePublished && systemNotice.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.NotPublish)
                {
                    systemNotice.PublishedUserId = _userInfo.UserRoleId;
                    systemNotice.PublishedTime = DateTime.Now;
                }
                else if (addOrEditSystemNotice.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.NotPublish && systemNotice.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.HavePublished)
                {
                    systemNotice.PublishedUserId = null;
                    systemNotice.PublishedTime = null;
                }
                _mapper.Map(addOrEditSystemNotice, systemNotice);
                await _systemNoticeRepository.SaveChangesAsync();
                return ResponseOutput.Ok();
            }
        }
        [HttpDelete("{systemNoticeId:guid}")]
        public async Task DeleteSystemNotice(Guid systemNoticeId)
        {
            var success = await _systemNoticeRepository.BatchDeleteNoTrackingAsync(t => t.Id == systemNoticeId);
            return ResponseOutput.Result(success);
        }
        /// 设置已读 
        [HttpPut("{systemNoticeId:guid}")]
        public async Task SetSystemNoticeHaveRead(Guid systemNoticeId)
        {
            var systemNotice = (await _systemNoticeRepository.FirstOrDefaultAsync(t => t.Id == systemNoticeId)).IfNullThrowException();
            systemNotice.NoticeUserReadList.Add(new SystemNoticeUserRead() { SystemNoticeId = systemNoticeId });
            var success = await _systemNoticeRepository.SaveChangesAsync();
            return ResponseOutput.Result(success);
        }
        /// 获取登陆用户的系统通知列表  只是过滤了用户类型 和已经发布的
        [HttpPost]
        public async Task> GetUserSystemNoticeList(SystemNoticeQuery inQuery)
        {
            //防止生成sql生成GETDATE() 时区导致的问题
            var appDateTimeNow = DateTime.Now;
            var systemNoticeQueryable = _systemNoticeRepository
                .Where(t => t.NoticeUserTypeList.Any(t => t.UserTypeId == _userInfo.UserTypeId) && t.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.HavePublished)
                .WhereIf(inQuery.ApplicableProjectEnum != null, t => t.ApplicableProjectEnum == inQuery.ApplicableProjectEnum)
                .WhereIf(inQuery.NoticeLevelEnum != null, t => t.NoticeLevelEnum == inQuery.NoticeLevelEnum)
                .WhereIf(inQuery.NoticeModeEnum != null, t => t.NoticeModeEnum == inQuery.NoticeModeEnum)
                .WhereIf(inQuery.NoticeStateEnum != null && inQuery.NoticeStateEnum != Domain.Share.SystemNotice_NoticeStateEnum.HaveExpired, t => t.NoticeStateEnum == inQuery.NoticeStateEnum)
                .WhereIf(inQuery.NoticeModeEnum != null && inQuery.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.HaveExpired, t => t.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.HavePublished && t.EndDate != null && t.EndDate < appDateTimeNow)
                .WhereIf(inQuery.NoticeTypeEnum != null, t => t.NoticeTypeEnum == inQuery.NoticeTypeEnum)
                .WhereIf(!string.IsNullOrWhiteSpace(inQuery.FileName), t => t.FileName.Contains(inQuery.FileName))
                .WhereIf(!string.IsNullOrWhiteSpace(inQuery.NoticeContent), t => t.NoticeContent.Contains(inQuery.NoticeContent))
                .ProjectTo(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken, userId = _userInfo.UserRoleId });
            return await systemNoticeQueryable.ToPagedListAsync(inQuery);
        }
        public async Task> GetUserNoticeList()
        {
            //防止生成sql生成GETDATE() 时区导致的问题
            var appDateTimeNow = DateTime.Now;
            var query = _systemNoticeRepository
                  .Where(t => t.NoticeUserTypeList.Any(t => t.UserTypeId == _userInfo.UserTypeId) && t.NoticeStateEnum == Domain.Share.SystemNotice_NoticeStateEnum.HavePublished && !t.NoticeUserReadList.Any(t => t.CreateUserId == _userInfo.UserRoleId))
                  .Where(t => t.EndDate == null || t.EndDate != null && t.EndDate > appDateTimeNow)
                  .ProjectTo(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken, userId = _userInfo.UserRoleId });
            return await query.ToListAsync();
        }
    }
}