using GxPress.Service.Interface.AppHomePage;
using GxPress.Repository.Interface;
using GxPress.Repository.Interface.Media;
using GxPress.Request.ArticleGroup;
using System.Threading.Tasks;
using System.Collections.Generic;
using GxPress.Result.SystemLabel;
using GxPress.Result.Media;
using GxPress.Repository.Interface.SystemLabel;
using GxPress.Repository.Interface.Navigation;
using AutoMapper;
using System.Linq;
using GxPress.Common.Tools;
using GxPress.Common.Page;
using GxPress.Request.Media;
using GxPress.Repository.Interface.Teacher;
using GxPress.Request.TeacherRequest;
using GxPress.Result.Teacher;

namespace GxPress.Service.Implement.AppHomePage
{
    public partial class AppHomePageService : IAppHomePageService
    {
        private readonly IArticleGroupRepository articleGroupRepository;
        private readonly IMediaRepository mediaRepository;
        private readonly IMapper _mapper;
        private readonly IMiddleLableRepository _middleLableRepository;
        private readonly ISystemLabelRepository _systemLabelRepository;
        private readonly IMediaLableRepository _mediaLableRepository;
        private readonly IMiddleLableNexusRepository middleLableNexusRepository;
        private readonly ISystemLableMediaRepository systemLableMediaRepository;
        private readonly ITeacherRepository teacherRepository;
        public AppHomePageService(IArticleGroupRepository articleGroupRepository, IMediaRepository mediaRepository, IMiddleLableRepository _middleLableRepository, ISystemLabelRepository _systemLabelRepository, IMiddleLableNexusRepository middleLableNexusRepository, IMediaLableRepository _mediaLableRepository, IMapper _mapper, ITeacherRepository teacherRepository, ISystemLableMediaRepository systemLableMediaRepository)
        {
            this.articleGroupRepository = articleGroupRepository;
            this.mediaRepository = mediaRepository;
            this._middleLableRepository = _middleLableRepository;
            this._systemLabelRepository = _systemLabelRepository;
            this.middleLableNexusRepository = middleLableNexusRepository;
            this._mediaLableRepository = _mediaLableRepository;
            this._mapper = _mapper;
            this.teacherRepository = teacherRepository;
            this.systemLableMediaRepository = systemLableMediaRepository;
        }
        /// <summary>
        /// 大咖讲座
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<List<AppLabelResult<MediaCathedraResult>>> GetMediasByTeacherAsync(ArticleGroupRequest request)
        {
            var results = new List<AppLabelResult<MediaCathedraResult>>();
            //大师讲座
            if (request.StyleCss == "Cathedra")
            {
                request.Sort = "";
                request.PerPage = 30;
                var items = await mediaRepository.GetMediasByTeacherAsync(request);
                results.Add(new AppLabelResult<MediaCathedraResult>()
                {
                    LabelName = "今日推荐",
                    IsPage = false,
                    ResourceType = 40,
                    Method = "",
                    Items = items
                });
                request.Sort = "recommend";
                request.PerPage = 10;
                items = await mediaRepository.GetMediasByTeacherAsync(request);
                results.Add(new AppLabelResult<MediaCathedraResult>()
                {
                    LabelName = "更多精彩",
                    IsPage = true,
                    ResourceType = 40,
                    Method = "post",
                    Items = items,
                    ActionUrl = "api/app/page/cathedra-page"
                });
                foreach (var item in results)
                {
                    foreach (var model in item.Items)
                    {
                        model.Duration = "02:19:20";
                        model.ImageUrls = Common.Tools.StringUtils.AddDomain(model.ImageUrls);
                    }
                }
            }
            //会员特供
            if (request.StyleCss == "VipSupply")
            {
                return await GetVipSupplyAsync(request);
            }
            //每日好书
            if (request.StyleCss == "DayGoodBook")
            {
                return await GetDayGoodBookAsync(request);
            }
            return results;
        }
        /// <summary>
        /// 每日好书
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<List<AppLabelResult<MediaCathedraResult>>> GetDayGoodBookAsync(ArticleGroupRequest request)
        {
            request.ActionUrl = "api/app/page/lable";
            return await GetVipSupplyAsync(request);
        }
        /// <summary>
        /// 每日好文
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<PagedList<MediaCathedraResult>> GetDayGoodTextAsync(MediaSearchRequest request)
        {
            var result = new PagedList<MediaCathedraResult>();
            var model = await mediaRepository.GetAllAsync(request);
            var list = new List<MediaCathedraResult>();
            foreach (var item in model.Items)
            {
                var mediaCathedraResult = new MediaCathedraResult();
                mediaCathedraResult.Author = item.Author;
                mediaCathedraResult.CollectCount = item.CollectCount;
                mediaCathedraResult.CreatedDate = item.CreatedDate;
                mediaCathedraResult.Id = item.Id;
                mediaCathedraResult.ImageUrls = item.ImageUrls;
                mediaCathedraResult.MediaType = item.MediaType;
                mediaCathedraResult.ReadCount = item.ReadCount;
                mediaCathedraResult.Title = item.Title;
                mediaCathedraResult.Summary = item.Summary;
                mediaCathedraResult.Press = item.Press;
                list.Add(mediaCathedraResult);
            }
            result.Total = model.Total;
            foreach (var item in list)
            {
                item.ImageUrls = StringUtils.AddDomain(item.ImageUrls);
            }
            result.Items = list;
            return result;
        }
        /// <summary>
        /// 获取每日微课
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<PagedList<MediaCathedraResult>> GetDayWeBookAsync(MediaDayWeBookRequest request)
        {
            var result = new PagedList<MediaCathedraResult>();
            var systemLabel = await _systemLabelRepository.GetByNameAsync(request.Name);
            var mediaLableIdRequest = new MediaLableIdRequest();
            mediaLableIdRequest.Page = request.Page;
            mediaLableIdRequest.PerPage = request.PerPage;
            var ids = await systemLableMediaRepository.GetMediaIdsAsync(systemLabel.Id, 0);
            //var mediaIds = await _mediaLableRepository.GetMediaIdsAysnc(systemLabel.Id);
            mediaLableIdRequest.Ids = ids.ToList();
            return await mediaRepository.GetMediaByLableIdAsync(mediaLableIdRequest);
        }
        /// <summary>
        /// 会员特供
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<List<AppLabelResult<MediaCathedraResult>>> GetVipSupplyAsync(ArticleGroupRequest request)
        {
            var result = new List<AppLabelResult<MediaCathedraResult>>();
            //根据样式查找导航数据
            var articleGroup = await articleGroupRepository.GetArticleGroupAsync(request.StyleCss);
            if (articleGroup.IsMiddleLable)
            {
                //获取中间页面
                var middleLable = await _middleLableRepository.GetAsync(articleGroup.MiddleLableId);
                //获取中间页标签
                var middleLableNexusIds = await middleLableNexusRepository.GetAllTaskAsync(middleLable.Id);
                //获取标签
                var systemLabels = await _systemLabelRepository.GetAllAsync(middleLableNexusIds.Select(n => n.LableId).ToList());
                foreach (var item in systemLabels)
                {
                    //获取媒体标签
                    var mediaIds = await systemLableMediaRepository.GetMediaIdsAsync(item.Id, 0);
                    var medias = await mediaRepository.GetNavigationMediaResults(mediaIds, 1, item.PageSize);
                    var list = new List<MediaCathedraResult>();
                    foreach (var mediaModel in medias)
                    {
                        list.Add(new MediaCathedraResult { Id = mediaModel.Id, Summary = mediaModel.Summary, Title = mediaModel.Title, ImageUrls = StringUtils.AddDomain(mediaModel.ImageUrls), Author = mediaModel.Author, ReadCount = mediaModel.ReadCount, CreatedDate = mediaModel.CreatedDate, CollectCount = mediaModel.CollectCount, MediaType = mediaModel.MediaType });
                    }
                    //获取常规数据
                    var mediaCathedraResult = new AppLabelResult<MediaCathedraResult>()
                    {
                        IsPage = item.IsPage,
                        Id = item.Id,
                        LabelName = item.LabelName,
                        ResourceType = 40,
                        Items = list,
                        Method = item.IsPage ? "post" : "",
                        ActionUrl = item.IsPage ? request.ActionUrl : ""
                    };
                    result.Add(mediaCathedraResult);
                }
            }
            return result;
        }
        /// <summary>
        /// 大咖讲座
        /// </summary>
        /// <returns></returns>
        public async Task<PagedList<MediaCathedraResult>> MediaCathedraResult(ArticleGroupRequest request)
        {
            var result = new PagedList<MediaCathedraResult>();
            result.Items = await mediaRepository.GetMediasByTeacherAsync(request);
            foreach (var item in result.Items)
            {
                item.ImageUrls = Common.Tools.StringUtils.AddDomain(item.ImageUrls);
            }
            result.Total = await mediaRepository.GetMediasByTeacherCountAsync(request);
            return result;
        }
        /// <summary>
        /// 根据IDs
        /// </summary>
        /// <returns></returns>
        public async Task<IEnumerable<MediaCathedraResult>> GetMediaByLableIdsAsync(MediaIdsRequest request)
        {
            //获取标签
            var systemLabel = await _systemLabelRepository.GetAsync(request.LableId);
            if (systemLabel == null)
                return null;
            var ids = await systemLableMediaRepository.GetMediaIdsAsync(request.LableId, 0);
            request.Ids = ids.ToList();
            request.Limit = systemLabel.PageSize;
            return await mediaRepository.GetMediaByLableIdsAsync(request);
        }
        /// <summary>
        /// 根据IDs
        /// </summary>
        /// <returns></returns>
        public async Task<PagedList<MediaCathedraResult>> GetMediaByLableIdAsync(MediaLableIdRequest request)
        {
            //获取标签
            var systemLabel = await _systemLabelRepository.GetAsync(request.LableId);
            if (systemLabel == null)
                return null;
            var ids = await _mediaLableRepository.GetMediaIdsAysnc(request.LableId);
            request.Ids = ids.ToList();
            return await mediaRepository.GetMediaByLableIdAsync(request);
        }
        /// <summary>
        /// 名师
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<PagedList<TeacherResult>> GetTeacherAsync(TeacherRequest request)
        {

            var teachers = await teacherRepository.GetTeacherResult(request);
            return teachers;
        }
        /// <summary>
        /// 书城
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task<List<AppLabelResult<MediaCathedraResult>>> GetBookCityAsync(ArticleGroupRequest request)
        {
            var result = new List<AppLabelResult<MediaCathedraResult>>();
            //获取中间页面
            var middleLable = await _middleLableRepository.GetAsync("书城");
            //获取中间页标签
            var middleLableNexusIds = await middleLableNexusRepository.GetAllTaskAsync(middleLable.Id);
            //获取标签
            var systemLabels = await _systemLabelRepository.GetAllAsync(middleLableNexusIds.Select(n => n.LableId).ToList());
            foreach (var item in systemLabels)
            {
                //获取媒体标签
                var mediaIds = await systemLableMediaRepository.GetMediaIdsAsync(item.Id, 0);
                var medias = await mediaRepository.GetNavigationMediaResults(mediaIds, 1, item.PageSize);
                var list = new List<MediaCathedraResult>();
                foreach (var mediaModel in medias)
                {
                    list.Add(new MediaCathedraResult { Id = mediaModel.Id, Title = mediaModel.Title, ImageUrls = StringUtils.AddDomain(mediaModel.ImageUrls), Author = mediaModel.Author, ReadCount = mediaModel.ReadCount, CreatedDate = mediaModel.CreatedDate, CollectCount = mediaModel.CollectCount, MediaType = mediaModel.MediaType });
                }
                //获取常规数据
                var mediaCathedraResult = new AppLabelResult<MediaCathedraResult>()
                {
                    IsPage = item.IsPage,
                    Id = item.Id,
                    LabelName = item.LabelName,
                    ResourceType = 40,
                    Items = list,
                    Method = item.IsPage ? "post" : "",
                    ActionUrl = item.IsPage ? request.ActionUrl : ""
                };
                result.Add(mediaCathedraResult);
            }

            return result;
        }
        /// <summary>
        /// 导航内容分页
        /// </summary>
        /// <returns></returns>
        public async Task<PagedList<MediaCathedraResult>> GetContentNavigationAsync(MediaContentNavigationRequest request)
        {
            if (request.CategoryId > 0)
            {
                var mediaIds = await systemLableMediaRepository.GetMediaIdsAsync(request.CategoryId, 1);
                request.MediaIds = mediaIds.ToList();
            }
            else
            {
                var mediaIds = await systemLableMediaRepository.GetMediaIdsByTypeValueAsync(1);
                request.MediaIds = mediaIds.ToList();
            }
            if (request.MediaIds.Count == 0)
            {
                var result = new PagedList<MediaCathedraResult>();
                result.Items = new List<MediaCathedraResult>();
            }
            return await mediaRepository.GetContentNavigationAsync(request);
        }
    }
}