using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AutoMapper;
using GxPress.Common.AppOptions;
using GxPress.Common.Exceptions;
using GxPress.Common.Page;
using GxPress.Common.Tools;
using GxPress.Entity;
using GxPress.Entity.Topic;
using GxPress.Repository.Interface;
using GxPress.Request.App.TopicAnalyze;
using GxPress.Result.App.Topic;
using Microsoft.Extensions.Options;
using Datory;
using SqlKata;

namespace GxPress.Repository.Implement
{
    public class TopicAnalyzeRepository: ITopicAnalyzeRepository
    {
        private readonly Repository<TopicAnalyze> _repository;
        private readonly Repository<User> _userRepository;
        private readonly Repository<TopicComment> _topicCommentRepository;
        private readonly Repository<Entity.Topic.Topic> _topicRepository;
        private readonly Repository<Department> _departmentRepository;
        private readonly IMapper _mapper;

        public TopicAnalyzeRepository(IOptionsMonitor<DatabaseOptions> dbOptionsAccessor, IMapper mapper)
        {
            var databaseType = StringUtils.ToEnum<DatabaseType>(dbOptionsAccessor.CurrentValue.DatabaseType, DatabaseType.MySql);
            var database = new Database(databaseType, dbOptionsAccessor.CurrentValue.ConnectionString);
            _repository = new Repository<TopicAnalyze>(database);
            _userRepository = new Repository<User>(database);
            _topicCommentRepository = new Repository<TopicComment>(database);
            _topicRepository = new Repository<Entity.Topic.Topic>(database);
            _departmentRepository=new Repository<Department>(database);
            _mapper = mapper;
        }

        public IDatabase Database => _repository.Database;
        public string TableName => _repository.TableName;
        public List<TableColumn> TableColumns => _repository.TableColumns;

        /// <summary>
        /// 设置 点赞 转发 收藏
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<bool> SetTopicAnalyzeAsync(TopicAnalyzeRequest request)
        {
            var user = await _userRepository.GetAsync(request.UserId);
            if (user == null) throw new BusinessException("不存在该账号");
            var topicAnalyze = await _repository.GetAsync(Q.Where(nameof(TopicAnalyze.AnalyzeType), request.TopicAnalyzeType)
                .Where(nameof(TopicAnalyze.TopicId), request.TopicId).Where(nameof(TopicAnalyze.TopicCommentId),request.TopicCommentId)
                .Where(nameof(TopicAnalyze.UserId), request.UserId));
            if (topicAnalyze != null && topicAnalyze.Id > 0)
                //throw new BusinessException("你已经点赞过了~!");
                return await _repository.DeleteAsync(topicAnalyze.Id);
            //查询该用户是否已经点赞过
            if (request.TopicAnalyzeType == 2)
            {
                if(request.TopicCommentId==0)
                   throw new BusinessException("评论Id必传！");
                //没有点赞则新增数据点赞条数
                var comment = await _topicCommentRepository.GetAsync(request.TopicCommentId);
                comment.Laud++;
                await _topicCommentRepository.UpdateAsync(comment);
            }
            return await InsertAsync(request);
        }

        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<bool> InsertAsync(TopicAnalyzeRequest request)
        {
            var topicAnalyze = new TopicAnalyze()
            {
                AnalyzeType = request.TopicAnalyzeType,
                TopicId = request.TopicId,
                TopicCommentId = request.TopicCommentId,
                UserId = request.UserId
            };
            return await _repository.InsertAsync(topicAnalyze) > 0;
        }
        /// <summary>
        /// 获取文章点赞数据
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<PagedList<TopicPraisePageResult>> GetTopicPraisePageAsync(TopicPraisePageSearchRequest request)
        {
            var query = Q.NewQuery();
            query.Where(nameof(TopicAnalyze.AnalyzeType), 1).Where(nameof(TopicAnalyze.TopicId), request.TopicId);
              if(request.Sort=="desc")
                query.OrderByDesc(nameof(TopicAnalyze.CreatedDate));
            var pagedList = new PagedList<TopicPraisePageResult>
            {
                Total = await _repository.CountAsync(query)
            };
            var list = await _repository.GetAllAsync(query.ForPage(request.Page, request.PerPage));
            var items = list.Select(user => _mapper.Map<TopicPraisePageResult>(user)).ToList();
            //获取文章名称
            var topic = await _topicRepository.GetAsync(request.TopicId);
            foreach (var item in items)
            {
                //获取用户
                var user = await _userRepository.GetAsync(item.UserId);
                item.TopicName = topic.Title;
                item.UserName = user.Name;
                item.Signature = user.Signature;
                item.AvatarUrl =StringUtils.AddDomain(user.AvatarUrl);
                //获取部门
                var department = await _departmentRepository.GetAsync(user.DepartmentId);
                item.DepartmentName = department != null ? department.Name : "";
            }
            pagedList.Items = items;
            return pagedList;
        }

        public async Task<int> CountAsync(Query query)
        {
            return await _repository.CountAsync(query);
        }

        public async Task<TopicAnalyze> GetAsync(Query query)
        {
            return await _repository.GetAsync(query);
        }

        public async Task<bool> DeleteAsync(int id)
        {
            return await _repository.DeleteAsync(id);
        }
    }
}
