using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using GxPress.Auth;
using GxPress.Common.Page;
using GxPress.Entity.Topic;
using GxPress.Repository.Interface;
using GxPress.Repository.Interface.Topic;
using GxPress.Request.App.Topic;
using GxPress.Result.App.Topic;
using GxPress.Service.Interface.Middle;
using GxPress.Service.Interface.Topic;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace GxPress.Api.WebControllers
{
    /// <summary>
    /// web话题
    /// </summary>
    [Route("api/web/topic")]
    [ApiController]
    [Authorize]
    public class WebTopicController : Controller
    {
        private readonly ILogger<WebTopicController> _logger;
        private readonly ITopicRepository _topicRepository;
        private readonly ILoginContext _loginContext;
        private readonly ITopicService _topicService;
        private readonly ITopicGroupRepository _topicGroupRepository;
        private readonly ITopicGroupUserRepository _topicGroupUserRepository;
        private readonly IMiddleService _middleService;
        private readonly ITopicGroupService topicGroupService;
        public WebTopicController(ILogger<WebTopicController> logger, ITopicRepository repository, ILoginContext loginContext,
            ITopicService topicService, ITopicGroupRepository topicGroupRepository,
            ITopicGroupUserRepository topicGroupUserRepository, IMiddleService middleService, ITopicGroupService topicGroupService)
        {
            _logger = logger;
            _topicRepository = repository;
            _loginContext = loginContext;
            _topicService = topicService;
            _topicGroupRepository = topicGroupRepository;
            _topicGroupUserRepository = topicGroupUserRepository;
            _middleService = middleService;
            this.topicGroupService = topicGroupService;
        }

        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("add")]
        public async Task<bool> Insert(TopicInRequest request)
        {
            // request.HtmlContent = StringUtils.RemoveEmoji(request.HtmlContent);
            // request.Content = StringUtils.RemoveEmoji(request.Content);
            // request.Title = StringUtils.RemoveEmoji(request.Title);
            request.UserId = _loginContext.AccountId;
            return await _topicService.InsertTopicAsync(request);
        }

        /// <summary>
        /// 获取话题详情
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("app-detail")]
        public async Task<TopicDetailResult> GetTopicDetailResult(TopicDetailRequest request)
        {
            request.UserId = _loginContext.AccountId;
            var topicDetail = await _topicService.GetTopicDetailResultAsync(request);
            return topicDetail;
        }
        /// <summary>
        /// 获取话题详情 web专属
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("web-app-detail")]
        [AllowAnonymous]
        public async Task<TopicDetailResult> GetWebTopicDetailResult(TopicDetailRequest request)
        {
            var topicDetail = await _topicService.GetTopicDetailResultAsync(request);
            return topicDetail;
        }
        /// <summary>
        /// app话题分页列表
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("list-page")]
        [AllowAnonymous]
        public async Task<PagedList<TopicListPageResult>> GetTopicListPage(TopicPageSearchRequest request)
        {
            request.UserId = _loginContext.AccountId;
            return await _topicService.GetTopicPageAsync(request);
        }
        /// <summary>
        /// Web小组话题分页列表
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>

        [HttpPost("user-list-page")]
        public async Task<PagedList<TopicListPageResult>> GetTopicByGroupAsync(TopicPageSearchRequest request)
        {
            request.UserId = _loginContext.AccountId;
            return await _topicService.GetTopicByGroupAsync(request);
        }
        /// <summary>
        ///最新 小组话题分页列表
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("page")]
        [AllowAnonymous]
        public async Task<PagedList<TopicListPageResult>> GetGroupTopicPageAsync(TopicDetailListRequest request)
        {
            request.UserId = _loginContext.AccountId;
            if (request.UserId <= 0)
                return await _topicService.GetAnonymousGroupTopicPageAsync(request);
            return await _topicService.GetGroupTopicPageAsync(request);
        }
        /// <summary>
        /// 获取用户话题分组
        /// </summary>
        /// <returns></returns>
        [HttpGet("group")]
        public async Task<IEnumerable<TopicGroup>> GetTopicGroups()
        {
            return await topicGroupService.GetTopicGroupsAsync(_loginContext.AccountId);
        }
        /// <summary>
        /// 获取用户话题分组集合
        /// </summary>
        /// <returns></returns>
        [HttpGet("list-group")]
        public async Task<IEnumerable<TopicGroup>> GetListTopicGroupsAsync()
        {
            return await topicGroupService.GetListTopicGroupsAsync(_loginContext.AccountId);
        }

        /// <summary>
        /// 添加话题分组
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPut("add-group")]
        public async Task<bool> InsertTopicGroup(TopicGroupInRequest request)
        {
            var topicGroup = new TopicGroup { Name = request.Name, UserId = _loginContext.AccountId };
            return await _topicGroupRepository.InsertAsync(topicGroup);
        }

        /// <summary>
        /// 修改分组名称
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPut("update-group")]
        public async Task<bool> UpdateGroup(TopicGroupInRequest request)
        {
            return await _topicGroupRepository.UpdateAsync(request);
        }

        /// <summary>
        /// 根据话题分组Id删除数据
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpDelete("delete_group")]
        public async Task<bool> DeleteTopicGroup([FromBody] TopicGroupDeRequest request)
        {
            return await _topicService.DeleteTopicGroupAsync(request.Ids);
        }

        /// <summary>
        /// 根据分组ID查询用户
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet("{id}")]
        public async Task<PagedList<TopicGroupUserResult>> GetTopicGroupUserById(int id)
        {
            return await _topicGroupUserRepository.GetTopicGroupUserById(id);
        }

        /// <summary>
        /// 添加话题小组成员
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("add-group-user")]
        public async Task<bool> InsertAsync([FromBody] TopicGroupUserInRequest request)
        {
            return await _topicService.InsertTopicGroupUserAsync(request.UserIds.Distinct().ToList(), request.TopicGroupId);
        }

        /// <summary>
        /// 根据ID删除话题分组成员
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpDelete("group-user")]
        public async Task<bool> DeleteUser(TopicGroupDeRequest request)
        {
            return await _topicService.DeleteTopicGroupUserAsync(request.Ids);
        }

        /// <summary>
        /// 排序
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPut("sort")]
        public async Task<bool> MoveSort(TopicMoveSortRequest request)
        {

            return await _topicGroupRepository.MoveSortAsync(request.FirstId, request.SecondId, _loginContext.AccountId);
        }

        /// <summary>
        /// 移动到
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPut("move")]
        public async Task<bool> MoveToGroup(MoveToGroupRequest request)
        {
            return await _topicService.MoveToGroupAsync(request);
        }

        /// <summary>
        /// 根据分组ID和姓名查询用户
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("search")]
        public async Task<PagedList<TopicGroupUserResult>> SearchTopicGroupUsers(SearchTopicGroupUsersRequest request)
        {
            return await _topicGroupUserRepository.SearchTopicGroupUsersAsync(request);
        }



        /// <summary>
        /// 删除话题
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("{id}")]
        public async Task<bool> Delete(int id)
        {
            return await _topicService.DeleteAsync(id);
        }

        /// <summary>
        /// 修改话题
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPut("update")]
        public async Task<bool> Update(TopicUpdateRequest request)
        {
            // request.HtmlContent = StringUtils.RemoveEmoji(request.HtmlContent);
            // request.Content = StringUtils.RemoveEmoji(request.Content);
            // request.Title = StringUtils.RemoveEmoji(request.Title);
            request.UserId = _loginContext.AccountId;
            return await _topicService.UpdateAsync(request);
        }

    }
}