using AutoMapper;
using LinqKit;
using Microsoft.EntityFrameworkCore;
using Ropin.Inspection.Common.Accessor.Interface;
using Ropin.Inspection.Model;
using Ropin.Inspection.Model.Entities;
using Ropin.Inspection.Model.ViewModel;
using Ropin.Inspection.Repository;
using Ropin.Inspection.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace Ropin.Inspection.Service
{
    public class TmtnRepairOrderService : ITmtnRepairOrderService
    {
        private readonly ITmtnRepairOrderRepository _repository;
        private readonly IMapper _mapper;
        private readonly IClaimsAccessor _claims;
        private readonly ITmtnRepairOrderItemRepository _tmtnRepairOrderItemRepository;
        private readonly ITmtnRepairOrderItemAppRepository _tmtnRepairOrderItemAppRepository;
        private readonly ITsysUserRepository _tsysUserRepository;
        private readonly ITdevDevStoreRepository _tdevDevStoreRepository;
        private readonly InspectionDbContext _sqlDBContext;
        public TmtnRepairOrderService(IClaimsAccessor claims, InspectionDbContext sqlDBContext, ITmtnRepairOrderItemRepository tmtnRepairOrderItemRepository, ITdevDevStoreRepository tdevDevStoreRepository, ITsysUserRepository tsysUserRepository, ITmtnRepairOrderRepository repository, ITmtnRepairOrderItemAppRepository tmtnRepairOrderItemAppRepository, IMapper mapper)
        {
            _repository = repository;
            _tmtnRepairOrderItemAppRepository = tmtnRepairOrderItemAppRepository;
            _mapper = mapper;
            _claims = claims;
            _tsysUserRepository = tsysUserRepository;
            _tdevDevStoreRepository = tdevDevStoreRepository;
            _tmtnRepairOrderItemRepository = tmtnRepairOrderItemRepository;
            _sqlDBContext = sqlDBContext;
        }
        public async Task CreateOneAsync(TmtnRepairOrderViewModel viewModel)
        {
            var content = _mapper.Map<TMTN_RepairOrder>(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(string id)
        {
            var content = await _repository.GetByIdAsync(id);
            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<TmtnRepairOrderViewModel>> GetAllAsync()
        {
            var pagedList = await _repository.GetAllAsync();
            var contentDtoList = _mapper.Map<IEnumerable<TmtnRepairOrderViewModel>>(pagedList.Where(i => i.C_Status == "1").ToList());
            return contentDtoList.ToList();
        }
        public async Task<TMTN_RepairOrder> CreateRepairOrderAsync(TmtnRepairOrderViewModel content)
        {
            //var contentDto = _mapper.Map<TmtnRepairOrderViewModel>(content);
            TMTN_RepairOrder record = new TMTN_RepairOrder();
            record.C_Name = content.C_Name;
            record.C_DevStoreCode = content.C_DevStoreCode;
            record.C_RepairContent = content.C_RepairContent;
            record.C_Remark = content.C_Remark;
            record.C_ID = Guid.NewGuid().ToString();
            record.C_CreateBy = _claims.ApiUserId;
            record.D_CreateOn = DateTime.Now;
            record.C_Status = "1";

            string itemId = Guid.NewGuid().ToString();
            await _tmtnRepairOrderItemRepository.CreateOneAsync(new TMTN_RepairOrderItem
            {
                C_ID = itemId,
                C_RepairCode = record.C_ID,
                C_RepairRecord = content.C_RepairContent,
                C_Remark = content.C_Remark,
                C_CreateBy = _claims.ApiUserId,
                D_CreateOn = DateTime.Now,
                C_Status = "1"
            });
            await _tmtnRepairOrderItemRepository.SaveAsync();
            if (null != content.FilePaths && content.FilePaths.Any())
                {
                    foreach (string imgPath in content.FilePaths)
                    {

                    await _tmtnRepairOrderItemAppRepository.CreateRangeAsync(new List<TMTN_RepairOrderItemApp>{ new TMTN_RepairOrderItemApp
                    {
                        C_ID = Guid.NewGuid().ToString(),
                        C_RepairOrderItemCode = record.C_ID,   //record.C_ID后期调整,itemId
                        C_Name = "故障上报记录图片",
                        C_Url = imgPath,
                        //C_Type = "1",
                        C_Remark = "",
                        C_CreateBy = _claims.ApiUserId,
                        D_CreateOn = DateTime.Now,
                        C_Status = "1"
                    }, new TMTN_RepairOrderItemApp
                    {
                        C_ID = Guid.NewGuid().ToString(),
                        C_RepairOrderItemCode = itemId,   //record.C_ID后期调整,itemId
                        C_Name = "故障上报记录图片",
                        C_Url = imgPath,
                        //C_Type = "1",
                        C_Remark = "",
                        C_CreateBy = _claims.ApiUserId,
                        D_CreateOn = DateTime.Now,
                        C_Status = "1"
                    }});
                    //await _tmtnRepairOrderItemAppRepository.CreateOneAsync(new TMTN_RepairOrderItemApp
                    //    {
                    //        C_ID = Guid.NewGuid().ToString(),
                    //        C_RepairOrderItemCode = itemId,   //record.C_ID后期调整,itemId
                    //        C_Name = "故障上报记录图片",
                    //        C_Url = imgPath,
                    //        //C_Type = "1",
                    //        C_Remark = "",
                    //        C_CreateBy = _claims.ApiUserId,
                    //        D_CreateOn = DateTime.Now,
                    //        C_Status = "1"
                    //    });
                    //    var resultItemImage = await _tmtnRepairOrderItemAppRepository.SaveAsync();
                    //    if (!resultItemImage)
                    //    {
                    //        throw new Exception("创建失败");
                    //    }
                    }
                }
            _repository.Create(record);
            var result = await _repository.SaveAsync();
            if (!result)
            {
                record = null;
                throw new Exception("创建失败");
            }
            return record;
        }
        public async Task<IEnumerable<TmtnRepairOrderViewModel>> GetConditionAsync(TmtnRepairOrderSearchModel searchModel)
        {
            var predicate = PredicateBuilder.New<TMTN_RepairOrder>(true);//查询条件,推荐后台使用这种方式灵活筛选
            #region 添加条件查询
            //predicate = predicate.And(i => i.C_Status.Equals("1"));
            if (!string.IsNullOrEmpty(searchModel.C_Status))
            {
                predicate = predicate.And(i => i.C_Status.Equals(searchModel.C_Status));
            }
            if (!string.IsNullOrEmpty(searchModel.C_DevStoreCode))
            {
                predicate = predicate.And(i => i.C_DevStoreCode.Equals(searchModel.C_DevStoreCode));
            }
            if (!string.IsNullOrEmpty(searchModel.C_ID))
            {
                predicate = predicate.And(i => i.C_ID.Equals(searchModel.C_ID));
            }
            if (!string.IsNullOrEmpty(searchModel.C_Name))
            {
                predicate = predicate.And(i => i.C_Name.Contains(searchModel.C_Name));
            }
            #endregion
            var list = await _repository.GetPageAsync(predicate, "C_Name,-D_CreateOn", searchModel.IsPagination, searchModel.PageIndex, searchModel.PageSize);
            searchModel.TotalCount = list.Totals;
            var dtoList = _mapper.Map<List<TMTN_RepairOrder>, List<TmtnRepairOrderViewModel>>(list.Rows);
            foreach (var item in dtoList)
            {
                var devStoreList = await _tmtnRepairOrderItemAppRepository.GetByConditionAsync(x => x.C_RepairOrderItemCode == item.C_ID);
                item.FilePaths = devStoreList.Select(x=>x.C_Url).ToList<string>();
            }


            //var repairOrderItem = _sqlDBContext.GetDbSet<TMTN_RepairOrderItem>();
            //var repairOrderItemApp = _sqlDBContext.GetDbSet<TMTN_RepairOrderItemApp>();
            //var query = from m in dtoList
            //            join p in repairOrderItem.AsNoTracking() on m.C_ID equals p.C_RepairCode into oi
            //            from orderItems in oi.DefaultIfEmpty()
            //            //join k in repairOrderItemApp.AsNoTracking() on m.C_ID equals k.C_RepairOrderItemCode into oia
            //            //from orderApps in oia.DefaultIfEmpty()
            //            join n in repairOrderItemApp.AsNoTracking() on orderItems.C_ID equals n.C_RepairOrderItemCode into oiaa
            //            from orderItemApps in oiaa.DefaultIfEmpty()
            //            select new
            //            {
            //                infor1 = m,
            //                infor2 = orderItems,
            //                infor4 = orderItemApps,

            //            };




            return dtoList;
        }

        public async Task<IEnumerable<TmtnRepairOrderWithImageViewModel>> GetRepairOrderWithImageAsync(TmtnRepairOrderSearchModel searchModel)
        {
            var predicate = PredicateBuilder.New<TMTN_RepairOrder>(true);//查询条件,推荐后台使用这种方式灵活筛选
            #region 添加条件查询
            //predicate = predicate.And(i => i.C_Status.Equals("1"));
            if (!string.IsNullOrEmpty(searchModel.C_DevStoreCode))
            {
                predicate = predicate.And(i => i.C_DevStoreCode.Equals(searchModel.C_DevStoreCode));
            }
            if (!string.IsNullOrEmpty(searchModel.C_ID))
            {
                predicate = predicate.And(i => i.C_ID.Equals(searchModel.C_ID));
            }
            if (!string.IsNullOrEmpty(searchModel.C_Name))
            {
                predicate = predicate.And(i => i.C_Name.Contains(searchModel.C_Name));
            }
            #endregion
            var list = await _repository.GetPageAsync(predicate, "C_Name,-D_CreateOn", searchModel.IsPagination, searchModel.PageIndex, searchModel.PageSize);
            searchModel.TotalCount = list.Totals;
            var dtoList = _mapper.Map<List<TMTN_RepairOrder>, List<TmtnRepairOrderViewModel>>(list.Rows);
            var devStoreList = await _tdevDevStoreRepository.GetByConditionAsync(x => x.C_ID == searchModel.C_DevStoreCode);
            var devStore = devStoreList.FirstOrDefault();
            IEnumerable<TSYS_User> userList = await _tsysUserRepository.GetAllAsync();
            var q = from a in dtoList
                    join b in userList
                    on a.C_CreateBy equals b.C_UserID
                    select new TmtnRepairOrderWithImageViewModel
                    {
                        C_ID = a.C_ID,
                        C_Name = a.C_Name,
                        C_DevStoreCode = a.C_DevStoreCode,
                        C_Url = a.C_Url,
                        D_CreateOn = a.D_CreateOn,
                        C_Status = a.C_Status,
                        C_CreateUserName = b.C_Name,
                        C_DevStoreName = devStore.C_Name
                    };


            return q;
        }
        public async Task<IEnumerable<TmtnRepairOrderRecordDetailViewMode>> GetRecordsConditionAsync(TmtnRepairOrderRecordSearchModel searchModel)
        {
            var content = await _repository.GetRecordsConditionAsync(searchModel, _claims.Linsence);
            return content;
        }
        public async Task<TispRecord30DaysStatisticsViewModel> GetRecords30DaysStatisticsAsync(string storeCode)
        {
            var pagedList = await _repository.GetRecords30DaysStatisticsAsync(storeCode);
            TispRecord30DaysStatisticsViewModel model = new TispRecord30DaysStatisticsViewModel();
            object[] normal = pagedList.Select(d => d.Normal).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<RepairStatistics> GetRepairStatisticsAsync(string storeCode)
        {
            return await _repository.GetRepairStatisticsAsync(storeCode);
        }
        public async Task<IEnumerable<FullScreenRecordItem>> GetRepairStatisticsFullScreenAsync(string storeCode)
        {
            RepairStatistics repair =  await _repository.GetRepairStatisticsAsync(storeCode);
            if (null == repair)
            {
                return new FullScreenRecordItem[0];
            }
            IEnumerable<FullScreenRecordItem> fullScreenRecordItems = new FullScreenRecordItem[5] {
            new FullScreenRecordItem
                    {
                        x = "取消维修",
                        y = Convert.ToString(repair.Cancel)
                    }
            ,
            new FullScreenRecordItem
                    {
                        x = "确认维修",
                        y = Convert.ToString(repair.Confirm)
                    }
            ,
            new FullScreenRecordItem
                    {
                        x = "完成维修",
                        y = Convert.ToString(repair.Complete)
                    }
            ,
            new FullScreenRecordItem
                    {
                        x = "审批中",
                        y = Convert.ToString(repair.Approval)
                    }
            ,
            new FullScreenRecordItem
                    {
                        x = "正在维修",
                        y = Convert.ToString(repair.RepairOn)
                    }
        };

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


        public async Task UpdateAsync(string code, TmtnRepairOrderUpdateModel updateModel)
        {
            var items = await _repository.GetByConditionAsync(C => C.C_ID == code);
            var content = items.FirstOrDefault();
            if (content == null)
            {
                throw new Exception("没有此数据");
            }
            content.C_Status = updateModel.C_Status;
            content.C_LastUpdatedBy = _claims.ApiUserId;
            content.D_LastUpdatedOn = DateTime.Now;
            //_mapper.Map(updateModel, content, typeof(TmtnRepairOrderUpdateModel), typeof(TMTN_RepairOrder));
            //var content = _mapper.Map<TMTN_RepairOrder>(viewModel);

            string itemId = Guid.NewGuid().ToString();
            await _tmtnRepairOrderItemRepository.CreateOneAsync(new TMTN_RepairOrderItem
            {
                C_ID = itemId,
                C_RepairCode = content.C_ID,
                C_RepairRecord = updateModel.C_RepairContent,
                C_Remark = updateModel.C_Remark,
                C_CreateBy = _claims.ApiUserId,
                D_CreateOn = DateTime.Now,
                C_Status = updateModel.C_Status
            });
            await _tmtnRepairOrderItemRepository.SaveAsync();

            if (null != updateModel.FilePaths && updateModel.FilePaths.Any())
            {
                foreach (string imgPath in updateModel.FilePaths)
                {
                    await _tmtnRepairOrderItemAppRepository.CreateOneAsync(new TMTN_RepairOrderItemApp
                    {
                        C_ID = Guid.NewGuid().ToString(),
                        C_RepairOrderItemCode = itemId,
                        C_Name = "维修更新图片",
                        C_Url = imgPath,
                        //C_Type = "1",
                        C_Remark = "",
                        C_CreateBy = _claims.ApiUserId,
                        D_CreateOn = DateTime.Now,
                        C_Status = "1"
                    });
                    var resultItemImage = await _tmtnRepairOrderItemAppRepository.SaveAsync();
                    if (!resultItemImage)
                    {
                        throw new Exception("创建失败");
                    }
                }
            }


            _repository.Update(content);
            var result = await _repository.SaveAsync();
            if (!result)
            {
                throw new Exception("更新失败");
            }
        }

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

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

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

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

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