using AutoMapper;
using Microsoft.AspNetCore.Http;
using Ropin.Inspection.Common.Accessor.Interface;
using Ropin.Inspection.Common.Helper;
using Ropin.Inspection.Model.Entities;
using Ropin.Inspection.Model.SearchModel;
using Ropin.Inspection.Model.ViewModel;
using Ropin.Inspection.Repository;
using Ropin.Inspection.Repository.Interface;
using Ropin.Inspection.Service.Interface;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Net.Http;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

namespace Ropin.Inspection.Service
{
    public class TispRecordService : ITispRecordService
    {

        private readonly IClaimsAccessor _claims;
        private readonly ITispRecordRepository _repository;
        private readonly ITmtnRepairOrderRepository _tmtnRepairOrderRepository;
        private readonly ITmtnDevOpsRepository _tmtnDevOpsRepository;
        private readonly ITispRecordItemRepository _tispRecordItemRepository;
        private readonly ITispRecordImageRepository _tispRecordImageRepository;
        private readonly IMapper _mapper;
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly IHttpClientFactory _httpClientFactory;
        private readonly ITsysUserRepository _tsysUserRepository;
        private readonly IPushMsgService _pushMsgService;
        public TispRecordService(IClaimsAccessor claims, ITispRecordRepository repository, ITmtnDevOpsRepository tmtnDevOpsRepository, ITmtnRepairOrderRepository tmtnRepairOrderRepository,ITispRecordItemRepository tispRecordItemRepository, ITispRecordImageRepository tispRecordImageRepository,IMapper mapper, IHttpClientFactory httpClientFactory, ITsysUserRepository tsysUserRepository, IPushMsgService pushMsgService)
        {
            _repository = repository;
            _tmtnRepairOrderRepository = tmtnRepairOrderRepository;
            _tmtnDevOpsRepository = tmtnDevOpsRepository;
            _tispRecordItemRepository = tispRecordItemRepository;
            _tispRecordImageRepository = tispRecordImageRepository;
            _mapper = mapper;
            _claims = claims;
            _httpClientFactory = httpClientFactory;
            _tsysUserRepository = tsysUserRepository;
            _pushMsgService = pushMsgService;
        }
        public async Task<IEnumerable<TispRecordDetailViewModel>> GetRecordsConditionAsync(TispRecordSearchModel searchModel)
        {
            var result = await _repository.GetRecordsConditionAsync(searchModel);
            return result;
        }
        public async Task CreateOneAsync(TispRecordViewModel viewModel)
        {
            var record = _mapper.Map<TISP_Record>(viewModel);
            record.C_CreateBy = _claims.ApiUserId;
            record.D_CreateOn = DateTime.Now;
            record.C_LastUpdatedBy = _claims.ApiUserId;
            record.D_LastUpdatedOn = DateTime.Now;
            _repository.Create(record);
            var result = await _repository.SaveAsync();
            if (!result)
            {
                throw new Exception("创建失败");
            }
        }
        public async Task CreateRecordAsync(TispRecordCreateViewModel viewModel)
        {
            TISP_Record record = _mapper.Map<TISP_Record>(viewModel);
            record.C_ID = Guid.NewGuid();
            record.C_CreateBy = _claims.ApiUserId;
            record.D_CreateOn = DateTime.Now;
            //有异常,巡检记录异常
            if (viewModel.TispRecordItemList.Where(i => i.C_Status == "0").Any())
            {
                record.C_Status = "2";
            }
            await _repository.CreateOneAsync(record);
            var result = await _repository.SaveAsync();
            if (!result)
            {
                throw new Exception("创建失败");
            }
            foreach (TispRecordItemCreateViewModel itemViewModel in viewModel.TispRecordItemList)
            {
                TISP_RecordItem item = _mapper.Map<TISP_RecordItem>(itemViewModel);
                item.C_ID = Guid.NewGuid();
                item.C_RecordCode = record.C_ID;
                item.C_CreateBy = _claims.ApiUserId;
                item.D_CreateOn = DateTime.Now;
                #region 异常不添加
                //var iCount = await _tispRecordItemRepository.GetContentAlarmCout(itemViewModel.C_ContentCode, viewModel.C_SpotCode);
                //if (iCount>0)
                //{
                //    item.C_Status = "5";
                //    await _tispRecordItemRepository.CreateOneAsync(item);
                //    var re = await _repository.SaveAsync();
                //    if (!re)
                //    {
                //        throw new Exception("创建失败");
                //    }
                //    if (null != itemViewModel.FilePaths && itemViewModel.FilePaths.Any())
                //    {
                //        foreach (string imgPath in itemViewModel.FilePaths)
                //        {
                //            await _tispRecordImageRepository.CreateOneAsync(new TISP_RecordImage { C_RecordItemCode = item.C_ID, C_ImageUrl = imgPath, C_Status = "1" });
                //            var resultItemImage = await _repository.SaveAsync();
                //            if (!resultItemImage)
                //            {
                //                throw new Exception("创建失败");
                //            }
                //        }
                //    }
                //    continue;
                //}
                #endregion

               
                await _tispRecordItemRepository.CreateOneAsync(item);
                var resultItem = await _repository.SaveAsync();
                if (!resultItem)
                {
                    throw new Exception("创建失败");
                }
                if (null != itemViewModel.FilePaths && itemViewModel.FilePaths.Any())
                {
                    foreach (string imgPath in itemViewModel.FilePaths)
                    {
                        await _tispRecordImageRepository.CreateOneAsync(new TISP_RecordImage { C_RecordItemCode = item.C_ID, C_ImageUrl = imgPath, C_Status = "1" });
                        var resultItemImage = await _repository.SaveAsync();
                        if (!resultItemImage)
                        {
                            throw new Exception("创建失败");
                        }
                    }
                }

                if (item.C_Status == "0")
                {
                    IEnumerable<TispRecordItemAlarmDetailViewModel> itemDetails = await _tispRecordItemRepository.GetAlarmRecordsByRecordItemIdAsync(item.C_ID);
                    TispRecordItemAlarmDetailViewModel itemDetail = itemDetails.FirstOrDefault();
                    if (itemDetail == null) return;
                    await _pushMsgService.PushRecordMsgAsync("MSG_TYPE_003", itemDetail);
                }
            }



            //IEnumerable<TISP_RecordItem> items = _mapper.Map<IEnumerable<TISP_RecordItem>>(viewModel.TispRecordItemList);
            //foreach (TISP_RecordItem item in items)
            //{
            //    item.C_RecordCode = record.C_ID;
            //    item.C_CreateBy = new Guid("62D5B5F5-3008-49B7-B0D6-CC337F1A3330");
            //    item.D_CreateOn = DateTime.Now;
            //    await _tispRecordItemRepository.CreateOneAsync(item);
            //    var resultItem = await _repository.SaveAsync();
            //    if (!resultItem)
            //    {
            //        throw new Exception("创建失败");
            //    }
            //}


        }
        public async Task CreateRecordAndImageAsync(IEnumerable<TispRecordViewModel> viewModel)
        {
            var recordList = _mapper.Map<IEnumerable<TISP_Record>>(viewModel);
            foreach (var record in recordList)
            {
                //record.C_CreateBy = new Guid("62D5B5F5-3008-49B7-B0D6-CC337F1A3330");
                record.D_CreateOn = DateTime.Now;
                //record.C_LastUpdatedBy = new Guid("62D5B5F5-3008-49B7-B0D6-CC337F1A3330");
                record.D_LastUpdatedOn = DateTime.Now;
                _repository.Create(record);
                var result = await _repository.SaveAsync();
                if (!result)
                {
                    throw new Exception("创建失败");
                }
            }

        }
        public async Task DeleteAsync(Guid id)
        {
            var record = await _repository.GetByIdAsync(id);
            if (record == null)
            {
                throw new Exception("没有此巡检内容");
            }
            _repository.Delete(record);
            var result = await _repository.SaveAsync();
            if (!result)
            {
                throw new Exception("删除失败");
            }
        }

        public async Task<IEnumerable<TispRecordViewModel>> GetAllAsync(string storeCode)
        {
            //TsysUserByRoleSearchModel roleSearchModel = new TsysUserByRoleSearchModel { Roles = new List<string> { "72d5b5f5-3008-49b7-b0d6-cc337f1a3331", "72d5b5f5-3008-49b7-b0d6-cc337f1a3332" } };
            //IEnumerable<TSYS_User> users = await _tsysUserRepository.GetUserDetailByRole(roleSearchModel);
            //var b = await _tsysUserRepository.GetAllAsync();
            var pagedList = await _repository.GetAllAsync();
            var recordDtoList = _mapper.Map<IEnumerable<TispRecordViewModel>>(pagedList);
            return recordDtoList.ToList();
        }
        public async Task<IEnumerable<AllSpotRecordWithDevViewModel>> GetAllSpotRecordAsync(AllSpotRecordSearchModel searchModel)
        {
            var pagedList = await _repository.GetAllSpotRecordAsync(searchModel);
            return pagedList;
        }
        public async Task<IEnumerable<AllSpotRecordViewModel>> GetUserSpotRecordAsync(UserSpotRecordSearchModel searchModel)
        {
            //if (string.IsNullOrEmpty(searchModel.OrganizeCode))
            //{
            //    searchModel.OrganizeCode = _claims.OrganizeId.ToString();
            //}
            var pagedList = await _repository.GetUserSpotRecordAsync(searchModel);
            return pagedList;
        }
        public async Task<IEnumerable<AllSpotRecordViewModel>> GetUserTodaySpotRecordsAsync(Guid id, string storeCode)
        {
            IEnumerable<AllSpotRecordViewModel> pagedList;
            //if (_claims.RoleIds.Contains("巡检员"))
            //{
             //   pagedList = await _repository.GetUserTodaySpotRecordsAsync(id, storeCode);
            //}
            //else
            //{
                pagedList = await _repository.GetUserTodaySpotRecordsAsync(Guid.Empty, storeCode);
            //}
            return pagedList;
        }
        public async Task<IEnumerable<AllSpotRecordViewModel>> GetUserTodayNotSpotRecordsAsync(Guid id, string storeCode)
        {
            IEnumerable<AllSpotRecordViewModel> pagedList;
            //if (_claims.RoleIds.Contains("巡检员"))
            //{
                //pagedList = await _repository.GetUserTodayNotSpotRecordsAsync(id, storeCode);
            //}
            //else
            //{
                pagedList = await _repository.GetUserTodayNotSpotRecordsAsync(Guid.Empty, storeCode);
            //}
            return pagedList;
        }
        public async Task<int> GetUserTodaySpotRecordCountAsync(Guid id, string storeCode)
        {
            var result = 0;
            //if (_claims.RoleIds.Contains("巡检员"))
            //{
             //   result = await _repository.GetUserTodaySpotRecordCountAsync(id, storeCode);
            //}
            //else
            //{
                result = await _repository.GetAllTodaySpotRecordCountAsync(storeCode);
            //}                  
            return result;
        }
        public async Task<int> GetUserTodayNotSpotRecordCountAsync(Guid id, string storeCode)
        {
            var result = 0;
            //if (_claims.RoleIds.Contains("巡检员"))
            //{
                //result = await _repository.GetUserTodayNotSpotRecordCountAsync(id, storeCode);
            //}
            //else
            //{
                result = await _repository.GetAllTodayNotSpotRecordCountAsync(storeCode);
            //}
            return result;
        }
        public Task<IEnumerable<TispRecordViewModel>> GetByConditionAsync(Expression<Func<TispRecordViewModel, bool>> expression)
        {
            throw new NotImplementedException();
        }

        public async Task<TispRecordViewModel> GetByIdAsync(Guid id)
        {
            var record = await _repository.GetByIdAsync(id);
            var recordDto = _mapper.Map<TispRecordViewModel>(record);
            return recordDto;
        }

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

        public async Task UpdateAsync(Guid id, TispRecordUpdateViewModel updateModel)
        {
            var record = await _repository.GetByIdAsync(id);
            if (record == null)
            {
                throw new Exception("没有此巡检记录");
            }
            record.C_LastUpdatedBy = _claims.ApiUserId;
            record.D_LastUpdatedOn = DateTime.Now;
            _mapper.Map(updateModel, record, typeof(TispRecordUpdateViewModel), typeof(TISP_Record));
            _repository.Update(record);
            var result = await _repository.SaveAsync();
            if (!result)
            {
                throw new Exception("更新失败");
            }
        }

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

        public Task<TispRecordViewModel> GetRecordAsync(Guid id)
        {
            throw new NotImplementedException();
        }
        public async Task<TispRecord30DaysStatisticsViewModel> GetRecords30DaysStatisticsAsync(string storeCode)
        {
            var pagedList = await _repository.GetRecords30DaysStatisticsAsync(storeCode);
            TispRecord30DaysStatisticsViewModel model = new TispRecord30DaysStatisticsViewModel();
            object[] normal = pagedList.Select(d => (Convert.ToInt32(d.Normal) + Convert.ToInt32(d.Abnormal)).ToString()).ToArray();
            object[] abnormal = pagedList.Select(d => d.Abnormal).ToArray();//.ForEach(a => empIds += a.Id + ",");
            string[] specificDay = pagedList.Select(d => d.SpecificDay).ToArray();
            model.AbnormalArray = abnormal;
            model.NormalArray = normal;
            model.SpecificDayArray = specificDay;
            return model;
        }
        public async Task<TispAlarmRecovery7DaysStatisticsViewModel> GetAlarmRecovery7DaysStatisticsAsync(string storeCode)
        {
            var pagedList = await _repository.GetAlarmRecovery7DaysStatisticsAsync(storeCode);
            TispAlarmRecovery7DaysStatisticsViewModel model = new TispAlarmRecovery7DaysStatisticsViewModel();
            object[] alarm = pagedList.Select(d => d.Alarm).ToArray();
            object[] recovery = pagedList.Select(d => d.Recovery).ToArray();//.ForEach(a => empIds += a.Id + ",");
            string[] specificDay = pagedList.Select(d => d.SpecificDay).ToArray();
            model.AlarmArray = alarm;
            model.RecoveryArray = recovery;
            model.SpecificDayArray = specificDay;
            return model;
        }
        public async Task<TodaySpotStatistics> GetTodaySpotStatisticsAsync(string storeCode)
        {
            TodaySpotStatistics model = await _repository.GetTodaySpotStatisticsAsync(storeCode);
            return model;
        }
        public async Task<TodaySpotContentStatistics> GetTodaySpotContentStatisticsAsync(string storeCode)
        {
            TodaySpotContentStatistics model = await _repository.GetTodaySpotContentStatisticsAsync(storeCode);
            return model;
        }
        public async Task<Record12MonthStatisticsViewModel> GetRecord12MonthStatisticsAsync(string storeCode)
        {
            var pagedList = await _repository.GetRecord12MonthStatisticsAsync(storeCode);
            Record12MonthStatisticsViewModel model = new Record12MonthStatisticsViewModel();
            object[] recordCount = pagedList.Select(d => d.RecordCount).ToArray();//.ForEach(a => empIds += a.Id + ",");
            string[] specificMonth = pagedList.Select(d => d.SpecificMonth).ToArray();
            model.RecordCountArray = recordCount;
            model.SpecificMonthArray = specificMonth;
            return model;
        }

        public async Task<IEnumerable<FullScreenRecordItem>> GetRecord12MonthStatisticsFullScreenAsync(string storeCode)
        {
            var pagedList = await _repository.GetRecord12MonthStatisticsAsync(storeCode);
            if (null == pagedList || !pagedList.Any())
            {
                IEnumerable<FullScreenRecordItem> recordItemDetail = null;
                return await Task.FromResult(recordItemDetail);
            }
            var q = from b in pagedList
                    select new FullScreenRecordItem
                    {
                        x = b.SpecificMonth,
                        y = Convert.ToString(b.RecordCount)
                    };
            return q;
        }

        public async Task<IEnumerable<FullScreenRecordItem>> GetAllDevOpsRecord12MonthStatisticsFullScreenAsync(string storeCode)
        {
            var recordPagedList = await _repository.GetRecord12MonthStatisticsAsync(storeCode);
            var repairOrderPagedList = await _tmtnRepairOrderRepository.GetRecord12MonthStatisticsAsync(storeCode);
            var devOpsPagedList = await _tmtnDevOpsRepository.GetRecord12MonthStatisticsAsync(storeCode);

            if (null == recordPagedList || !recordPagedList.Any())
            {
                IEnumerable<FullScreenRecordItem> recordItemDetail = null;
                return await Task.FromResult(recordItemDetail);
            }
            var qRecord = from b in recordPagedList.Skip(7).Take(6).ToList()//.Union(repairOrderPagedList).Union(devOpsPagedList)
                          select new FullScreenRecordItem
                    {
                        colorField = "点检",
                        x = Convert.ToString(b.RecordCount),
                        y = b.SpecificMonth,
                    };
            var qRepairOrder = from b in repairOrderPagedList.Skip(7).Take(6).ToList()
                               select new FullScreenRecordItem
                    {
                                   colorField = "维修",
                                   x = Convert.ToString(b.RecordCount),
                        y = b.SpecificMonth
                               };

            var qDevOps = from b in devOpsPagedList.Skip(7).Take(6).ToList()
                          select new FullScreenRecordItem
                          {
                              colorField = "维保",
                        x = Convert.ToString(b.RecordCount),
                        y = b.SpecificMonth
                          };


            return qRecord.Union(qRepairOrder).Union(qDevOps);
        }

    }
}