using AutoMapper;
using LinqKit;
using Ropin.Inspection.Common.Accessor.Interface;
using Ropin.Inspection.Common.Helper;
using Ropin.Inspection.Model;
using Ropin.Inspection.Model.Entities;
using Ropin.Inspection.Repository;
using Ropin.Inspection.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace Ropin.Inspection.Service
{
    public class TmtnPushMsgResultService : ITmtnPushMsgResultService
    {
        private readonly ITmtnPushMsgResultRepository _repository;
        private readonly IMapper _mapper;
        private readonly IClaimsAccessor _claims;
        private readonly IHttpClientFactory _httpClientFactory;
        private readonly ITmtnPushMsgToRepository _tmtnPushMsgToRepository;
        private readonly ITsysMessageRepository _tsysMessageRepository;
        public TmtnPushMsgResultService(
            IClaimsAccessor claims, 
            ITmtnPushMsgResultRepository repository, 
            IHttpClientFactory httpClientFactory,
            ITmtnPushMsgToRepository tmtnPushMsgToRepository,
            IMapper mapper, ITsysMessageRepository tsysMessageRepository)
        {
            _repository = repository;
            _mapper = mapper;
            _claims = claims;
            _httpClientFactory = httpClientFactory;
            _tmtnPushMsgToRepository = tmtnPushMsgToRepository;
            _tsysMessageRepository = tsysMessageRepository;
        }
        public async Task CreateOneAsync(TmtnPushMsgResultViewModel viewModel)
        {
            var content = _mapper.Map<TMTN_PushMsgResult>(viewModel);
            content.C_ID = Guid.NewGuid().ToString();
            content.C_CreateBy = _claims.ApiUserId;
            content.D_CreateOn = DateTime.Now;
            content.C_Status = "1";
            _repository.Create(content);
            var result = await _repository.SaveAsync();
            if (!result)
            {
                throw new Exception("创建失败");
            }
        }

        public async Task DeleteAsync(Guid id)
        {
            var content = await _repository.GetByIdAsync(id.ToString());
            if (content == null)
            {
                throw new Exception("数据库中没有此数据");
            }
            //_repository.Delete(content);
            //var result = await _repository.SaveAsync();
            content.C_LastUpdatedBy = _claims.ApiUserId;
            content.D_LastUpdatedOn = DateTime.Now;
            content.C_Status = "0";
            _repository.Update(content);
            var result = await _repository.SaveAsync();
            if (!result)
            {
                throw new Exception("删除失败");
            }
        }
        public async Task DeleteAsync(string code)
        {
            var items = await _repository.GetByConditionAsync(C => C.C_ID == code);
            var content = items.FirstOrDefault();
            if (content == null)
            {
                throw new Exception("没有此数据");
            }
            content.C_LastUpdatedBy = _claims.ApiUserId;
            content.D_LastUpdatedOn = DateTime.Now;
            content.C_Status = "0";
            _repository.Update(content);
            var result = await _repository.SaveAsync();
            if (!result)
            {
                throw new Exception("删除失败");
            }
        }
        public async Task<IEnumerable<TmtnPushMsgResultViewModel>> GetAllAsync()
        {
            var pagedList = await _repository.GetAllAsync();
            var contentDtoList = _mapper.Map<IEnumerable<TmtnPushMsgResultViewModel>>(pagedList.Where(i => i.C_Status == "1").ToList());
            return contentDtoList.ToList();
        }
        public async Task<IEnumerable<TmtnPushMsgResultViewModel>> GetConditionAsync(TmtnPushMsgResultSearchModel searchModel)
        {
            IEnumerable<TMTN_PushMsgResultModel> list = await _repository.GetConditionAsync(searchModel);
            if (list.Count()>0&&list.FirstOrDefault()==null)
            {
                return new List<TmtnPushMsgResultViewModel>();
            }
            var q = from b in list
                    group b by b.C_Content into g
                    select new TMTN_PushMsgResultModel
                    {
                        C_ID = g.OrderByDescending(t => t.C_Status).First().C_ID,
                        C_PushMsgToCode = g.OrderByDescending(t => t.C_Status).First().C_PushMsgToCode,
                        C_Content = g.OrderByDescending(t => t.C_Status).First().C_Content,
                        C_URL = g.OrderByDescending(t => t.C_Status).First().C_URL,
                        C_DevStoreCode = g.OrderByDescending(t => t.C_Status).First().C_DevStoreCode,
                        C_MsgTypeCode = g.OrderByDescending(t => t.C_Status).First().C_MsgTypeCode,
                        C_MsgTypeName = g.OrderByDescending(t => t.C_Status).First().C_MsgTypeName,
                        C_Subject = g.OrderByDescending(t => t.C_Status).First().C_Subject,
                        D_CreateOn = g.OrderByDescending(t => t.C_Status).First().D_CreateOn,
                        C_CreateBy = g.OrderByDescending(t => t.C_Status).First().C_CreateBy,
                        C_Status = g.OrderByDescending(t => t.C_Status).First().C_Status,
                        C_LastUpdatedBy = g.OrderByDescending(t => t.C_Status).First().C_LastUpdatedBy,
                        D_LastUpdatedOn = g.OrderByDescending(t => t.C_Status).First().D_LastUpdatedOn,
                        IsVideo = g.OrderByDescending(t => t.C_Status).First().IsVideo,
                        I_GenerationType = g.OrderByDescending(t => t.C_Status).First().I_GenerationType,
                        I_MsgStatus = g.OrderByDescending(t => t.C_Status).First().I_MsgStatus
                        //PushMsg = g.First().PushMsg
                    };
            var viewList = q.ToList();
            searchModel.TotalCount = viewList.Count();
            IEnumerable<TmtnPushMsgResultViewModel>
                dtoList = _mapper.Map<IEnumerable<TMTN_PushMsgResultModel>, IEnumerable<TmtnPushMsgResultViewModel>>(viewList);

            dtoList = searchModel.IsPagination ? dtoList.Skip((searchModel.PageIndex - 1) * searchModel.PageSize).Take(searchModel.PageSize).ToList() : dtoList;
            return dtoList;
        }

        public async Task<TmtnPushMsgResultViewModel> GetByIdAsync(string id)
        {
            var content = await _repository.GetByIdAsync(id);
            var contentDto = _mapper.Map<TmtnPushMsgResultViewModel>(content);
            return contentDto;
        }


        public async Task UpdateAsync(string code, TmtnPushMsgResultUpdateModel updateModel)
        {
            var items = await _repository.GetByConditionAsync(C => C.C_ID == code);
            var content = items.FirstOrDefault();
            if (content == null)
            {
                throw new Exception("没有此数据");
            }
            content.C_LastUpdatedBy = _claims.ApiUserId;
            content.D_LastUpdatedOn = DateTime.Now;
            _mapper.Map(updateModel, content, typeof(TmtnPushMsgResultUpdateModel), typeof(TMTN_PushMsgResult));
            _repository.Update(content);
            var result = await _repository.SaveAsync();
            if (result&& updateModel.C_MsgStatus!=null)
            {
                await _tsysMessageRepository.UpdateMsgStatus(updateModel.C_MessageCode, updateModel.C_MsgStatus);
            }
            if (!result)
            {
                throw new Exception("更新失败");
            }
        }

        public async Task<DevAlarmCount> GetPushMsgResultContentAsync(TmtnPushMsgResultSearchModel searchModel)
        {
            DevAlarmCount data = await _repository.GetPushMsgResultContentAsync(searchModel);
            return data;
        }

        public async Task UpdateStatusAsync(string msgCode, string Status, string userId)
        {
            var result = await _repository.UpdateStatus(msgCode, Status, userId);
            if (!result)
            {
                throw new Exception("更新失败");
            }
        }

        public Task<int> UpdateOneAsync(TmtnPushMsgResultViewModel viewModel, params string[] fields)
        {
            throw new NotImplementedException();
        }

        public Task<bool> IsExistAsync(string id)
        {
            throw new NotImplementedException();
        }

        public Task<IEnumerable<TmtnPushMsgResultViewModel>> GetByConditionAsync(Expression<Func<TmtnPushMsgResultViewModel, bool>> expression)
        {
            throw new NotImplementedException();
        }

        public Task UpdateAsync(string code, TpntAreaUpdateModel updateModel)
        {
            throw new NotImplementedException();
        }

        public Task<IEnumerable<TmtnPushMsgResultViewModel>> GetConditionAsync(TpntAreaSearchModel searchModel)
        {
            throw new NotImplementedException();
        }
    }
}