using System.Threading.Tasks;
using Datory;
using GxPress.Entity.Topic;
using GxPress.EnumConst;
using GxPress.Repository.Interface;
using GxPress.Repository.Interface.Note;
using GxPress.Repository.Interface.Visit;
using GxPress.Service.Interface.Visit;
namespace GxPress.Service.Implement.Visit
{
    /// <summary>
    /// 访问服务
    /// </summary>
    public class VisitService : IVisitService
    {
        private readonly IVisitRepository _visitRepository;
        private readonly ITopicRepository _topicRepository;
        private readonly INoteRepository _noteRepository;
        private readonly ITopicAddresseeRepository _topicAddresseeRepository;
        private readonly IArticleRepository _articleRepository;
        public VisitService(IVisitRepository visitRepository, ITopicRepository topicRepository, INoteRepository noteRepository, ITopicAddresseeRepository topicAddresseeRepository, IArticleRepository articleRepository)
        {
            _visitRepository = visitRepository;
            _topicRepository = topicRepository;
            _noteRepository = noteRepository;
            _topicAddresseeRepository = topicAddresseeRepository;
            _articleRepository = articleRepository;
        }
        /// <summary>
        /// /// 添加/数据条数
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="typeId">类型ID 类型1文章 2话题 3 收藏 4笔记 5通知 6站内信 7小组 8 会议详情</param>
        /// <param name="sourceId"></param>
        /// <returns></returns>
        public async Task<bool> AddVisit(int userId, int typeId, int sourceId)
        {
            var visitBool = await _visitRepository.ExistsAsync(Q.Where(nameof(Entity.Visit.Visit.TypeId), typeId).Where(nameof(Entity.Visit.Visit.SourceId), sourceId).Where(nameof(Entity.Visit.Visit.UserId), userId));
            if (visitBool == false)
            {
                var visit = new Entity.Visit.Visit();
                visit.TypeId = typeId;
                visit.UserId = userId;
                visit.SourceId = sourceId;
                await _visitRepository.InsertAsync(visit);
                //修改访问量数量
                if (typeId == AllTypeConst.Article.GetHashCode())
                {
                    var article = await _articleRepository.GetAsync(sourceId);
                    article.ReadCount++;
                    await _articleRepository.UpdateAsync(article);
                }
                //修改访问量数量
                if (typeId == AllTypeConst.Topic.GetHashCode())
                {
                    var topic = await _topicRepository.GetAsync(sourceId);
                    topic.ReadCount++;
                    await _topicRepository.UpdateAsync(topic);
                    //修改
                    await _topicAddresseeRepository.UpdateAsync(Q.Set(nameof(TopicAddressee.IsRead), true)
                  .Where(nameof(TopicAddressee.TopicId), sourceId)
                  .Where(nameof(TopicAddressee.UserId), userId));
                }
                if (typeId == AllTypeConst.Note.GetHashCode())
                {
                    var note = await _noteRepository.GetAsync(sourceId);
                    note.ReadCount++;
                    await _noteRepository.UpdateAsync(note);
                }
                return true;
            }
            return false;
        }

        /// <summary>
        /// 获取访问数量
        /// </summary>
        /// <param name="typeId"></param>
        /// <param name="sourceId"></param>
        /// <returns></returns>
        public async Task<int> GetCountAsync(int typeId, int sourceId)
        {
            return await _visitRepository.CountAsync(Q.Where(nameof(Entity.Visit.Visit.TypeId), typeId).Where(nameof(Entity.Visit.Visit.SourceId), sourceId));
        }
    }
}