using System.Threading.Tasks;
using GxPress.Repository.Interface.Navigation;
using GxPress.Service.Interface.Navigation;
using System.Transactions;
using GxPress.Common.Tools;
using System.Linq;
using System.Collections.Generic;
using GxPress.Request.Navigation;
using AutoMapper;
using GxPress.Result.MiddleLable;
using GxPress.Repository.Interface.SystemLabel;
namespace GxPress.Service.Implement.Navigation
{
    public class MiddleLableService : IMiddleLableService
    {
        private readonly IMiddleLableRepository middleLableRepository;
        private readonly IMiddleLableNexusRepository middleLableNexusRepository;
        private readonly IMapper _mapper;
        private readonly ISystemLabelRepository systemLabelRepository;
        public MiddleLableService(IMiddleLableRepository middleLableRepository, IMiddleLableNexusRepository middleLableNexusRepository, IMapper mapper, ISystemLabelRepository systemLabelRepository)
        {
            this.middleLableRepository = middleLableRepository;
            this.middleLableNexusRepository = middleLableNexusRepository;
            _mapper = mapper;
            this.systemLabelRepository = systemLabelRepository;
        }
        /// <summary>
        /// 添加中间件页面
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task<bool> InsertAsync(MiddleLableInRequest request)
        {
            try
            {
                using (var transactionScope = new System.Transactions.TransactionScope())
                {
                    var model = _mapper.Map<Entity.Navigations.MiddleLable>(request);
                    var middleLableId = await middleLableRepository.InsertAsync(model);
                    foreach (var item in request.MiddleLableNexusUpRequests)
                        item.MiddleLableId = middleLableId;
                    await middleLableNexusRepository.InsertAsync(request.MiddleLableNexusUpRequests);
                    transactionScope.Complete();
                }
            }
            catch
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<bool> DeleteAsync(int id)
        {
            try
            {
                using (var transactionScope = new System.Transactions.TransactionScope())
                {
                    await middleLableRepository.DeleteAsync(id);
                    await middleLableNexusRepository.DeleteByMiddleLableIdAsync(id);
                    transactionScope.Complete();
                }
            }
            catch
            {
                return false;
            }
            return true;
        }

        public async Task<bool> UpdateAsync(MiddleLableUpRequest request)
        {
            try
            {
                using (var transactionScope = new System.Transactions.TransactionScope())
                {
                    await middleLableRepository.UpdateAsync(request);
                    await middleLableNexusRepository.UpdateAsync(request.Id, request.MiddleLableNexusUpRequests);
                    transactionScope.Complete();
                }
            }
            catch
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// 详情
        /// </summary>
        /// <param name="middleLableId"></param>
        /// <returns></returns>
        public async Task<MiddleLableResult> GetMiddleLableResultAsync(int middleLableId)
        {
            var middleLable = await middleLableRepository.GetAsync(middleLableId);
            var middleLableResult = new MiddleLableResult()
            {
                Id = middleLable.Id,
                Name = middleLable.Name,
                Sort = middleLable.Sort,
                IsDisable = middleLable.IsDisable,
                IsSearch = middleLable.IsSearch,
                IsSlide = middleLable.IsSlide,
                TypeId = middleLable.TypeId
            };
            middleLableResult.MiddleLableNexusResults = new List<MiddleLableNexusResult>();
            var middleLableNexusList = await middleLableNexusRepository.GetAllTaskAsync(middleLableId);
            var systemLabels = await systemLabelRepository.GetAllAsync(middleLableNexusList.Select(n => n.LableId).ToList());
            foreach (var middleLableNexus in middleLableNexusList)
            {
                foreach (var item in systemLabels)
                {
                    if (middleLableNexus.LableId == item.Id)
                    {
                        var middleLableNexusResult = new MiddleLableNexusResult()
                        {
                            Id = middleLableNexus.Id,
                            LableId = item.Id,
                            MiddleLableId = middleLableId,
                            MiddleLableName = item.LabelName,
                            Sort = middleLableNexus.Sort
                        };
                        middleLableResult.MiddleLableNexusResults.Add(middleLableNexusResult);
                    }
                }
            }
            return middleLableResult;
        }
    }
}