using AutoMapper.Internal.Mappers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using NPOI.OpenXmlFormats.Dml;
using Shentun.Peis.CustomerOrgRegisters;
using Shentun.Peis.CustomerOrgs;
using Shentun.Peis.HelperDto;
using Shentun.Peis.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity;
using Volo.Abp.ObjectMapping;
namespace Shentun.Peis.CustomerOrgRegisters
{
    /// 
    /// 单位体检次数
    /// 
    [ApiExplorerSettings(GroupName = "Work")]
    [Authorize]
    public class CustomerOrgRegisterAppService : CrudAppService<
            CustomerOrgRegister, //The Book entity
            CustomerOrgRegisterDto, //Used to show books
            Guid, //Primary key of the book entity
            PagedAndSortedResultRequestDto, //Used for paging/sorting
            CreateCustomerOrgRegisterDto,
            UpdateCustomerOrgRegisterDto>
    {
        private readonly IRepository _userRepository;
        private readonly IRepository _customerOrgRepository;
        private readonly CustomerOrgManager _customerOrgManager;
        private readonly CustomerOrgRegisterManager _manager;
        private readonly CacheService _cacheService;
        public CustomerOrgRegisterAppService(
            IRepository repository,
            IRepository userRepository,
             IRepository customerOrgRepository,
            CustomerOrgManager customerOrgManager,
            CustomerOrgRegisterManager manager,
             CacheService cacheService)
            : base(repository)
        {
            _userRepository = userRepository;
            this._customerOrgRepository = customerOrgRepository;
            this._customerOrgManager = customerOrgManager;
            _manager = manager;
            _cacheService = cacheService;
        }
        /// 
        /// 获取通过主键
        /// 
        /// 
        /// 
        public override async Task GetAsync(Guid id)
        {
            return await base.GetAsync(id);
        }
        /// 
        /// 获取列表  团检体检登记  遗弃
        /// 
        /// 
        /// 
        [RemoteService(false)]
        public override async Task> GetListAsync(PagedAndSortedResultRequestDto input)
        {
            return await base.GetListAsync(input);
        }
        /// 
        /// 获取列表  团检体检登记  带搜索计划名称
        /// 
        /// 
        /// 
        public async Task> GetListInFilterAsync(GetListInFilterDto input)
        {
            var entlist = await Repository.GetQueryableAsync();
            if (!string.IsNullOrEmpty(input.Filter))
                entlist = entlist.Where(m => m.RegisterName.Contains(input.Filter));
            var entdto = entlist.Select(s => new CustomerOrgRegisterDto
            {
                CreationTime = s.CreationTime,
                CreatorId = s.CreatorId,
                Id = s.Id,
                LastModificationTime = s.LastModificationTime,
                LastModifierId = s.LastModifierId,
                BeginTime = DataHelper.ConversionDateToString(s.BeginTime),
                EndTime = DataHelper.ConversionDateToString(s.EndTime),
                RegisterName = s.RegisterName,
                RegisterNo = s.RegisterNo,
                MedicalTimes = s.MedicalTimes,
                IsComplete = s.IsComplete,
                CustomerOrgId = s.CustomerOrgId,
                CreatorName = _cacheService.GetSurnameAsync(s.CreatorId).Result,
                LastModifierName = _cacheService.GetSurnameAsync(s.LastModifierId).Result
            }).OrderBy(m => m.CreationTime).ToList();
            return entdto;
        }
        /// 
        /// 新增体检次数 只传单位ID
        /// 
        /// 单位ID
        /// 
        [HttpPost("api/customerorgregister/createcustomerorgregister")]
        public async Task CreateCustomerOrgRegisterAsync(Guid CustomerOrgId)
        {
            var customerOrg = await _customerOrgRepository.GetAsync(CustomerOrgId);
            var pathCode = customerOrg.PathCode.Substring(0, 5);
            var topParentCustomerOrg = await _customerOrgRepository.GetAsync(o => o.PathCode == pathCode);
            var CustomerOrgParenId = topParentCustomerOrg.Id;  //获取一级单位ID
            var entity = await _manager.CreateAsync(CustomerOrgParenId);
            entity = await Repository.InsertAsync(entity);
            var dto = ObjectMapper.Map(entity);
            return dto;
        }
        /// 
        /// 更新 是否完成状态
        /// 
        /// 
        /// 是否完成(Y N)
        /// 
        public async Task UpdateStateAsync(Guid id, char IsComplete)
        {
            var entity = await _manager.UpdateStateAsync(id, IsComplete);
            return ObjectMapper.Map(entity);
        }
        /// 
        /// 更新  不需要使用
        /// 
        /// 
        /// 
        /// 
        [RemoteService(false)]
        public override async Task UpdateAsync(Guid id, UpdateCustomerOrgRegisterDto input)
        {
            //var entity = await Repository.GetAsync(id);
            //var sourceEntity = ObjectMapper.Map(input);
            //_manager.UpdateAsync(sourceEntity, entity);
            //entity = await Repository.UpdateAsync(entity);
            //return ObjectMapper.Map(entity);
            return await base.UpdateAsync(id, input);
        }
        /// 
        /// 删除
        /// 
        /// 
        /// 
        public override async Task DeleteAsync(Guid id)
        {
            await _manager.CheckAndDeleteAsync(id);
        }
        /// 
        /// 获取团检体检登记列表,根据单位ID过滤查询
        /// 
        /// 
        /// 
        [HttpGet("api/app/customerorgregister/getlistincustomerorgid")]
        public async Task> GetListInCustomerOrgIdAsync(Guid CustomerOrgId)
        {
            //if (CustomerOrgId != Guid.Empty)
            var entlist = (await Repository.GetQueryableAsync()).Where(m => m.CustomerOrgId == CustomerOrgId).ToList();
            var entdto = entlist.Select(s => new CustomerOrgRegisterDto
            {
                CreationTime = s.CreationTime,
                CreatorId = s.CreatorId,
                Id = s.Id,
                LastModificationTime = s.LastModificationTime,
                LastModifierId = s.LastModifierId,
                BeginTime = DataHelper.ConversionDateToString(s.BeginTime),
                EndTime = DataHelper.ConversionDateToString(s.EndTime),
                RegisterName = s.RegisterName,
                RegisterNo = s.RegisterNo,
                MedicalTimes = s.MedicalTimes,
                IsComplete = s.IsComplete,
                CustomerOrgId = s.CustomerOrgId,
                CreatorName = _cacheService.GetSurnameAsync(s.CreatorId).Result,
                LastModifierName = _cacheService.GetSurnameAsync(s.LastModifierId).Result
            }).OrderBy(o => o.MedicalTimes).ToList();
            return entdto;
        }
        /// 
        /// 
        /// 
        /// 
        /// 
        [HttpPost("api/app/CustomerOrgRegister/GetLastCustomerOrgRegisterByCustomerOrgId")]
        public async Task GetLastCustomerOrgRegisterByCustomerOrgId(CustomerOrgIdInputDto input)
        {
            var entity = (await Repository.GetQueryableAsync()).Where(m => m.CustomerOrgId == input.CustomerOrgId)
                .OrderByDescending(o=>o.MedicalTimes).FirstOrDefault();
            var entdto = new CustomerOrgRegisterDto()
            {
                CreationTime = entity.CreationTime,
                CreatorId = entity.CreatorId,
                Id = entity.Id,
                LastModificationTime = entity.LastModificationTime,
                LastModifierId = entity.LastModifierId,
                BeginTime = DataHelper.ConversionDateToString(entity.BeginTime),
                EndTime = DataHelper.ConversionDateToString(entity.EndTime),
                RegisterName = entity.RegisterName,
                RegisterNo = entity.RegisterNo,
                MedicalTimes = entity.MedicalTimes,
                IsComplete = entity.IsComplete,
                CustomerOrgId = entity.CustomerOrgId,
                CreatorName = _cacheService.GetSurnameAsync(entity.CreatorId).Result,
                LastModifierName = _cacheService.GetSurnameAsync(entity.LastModifierId).Result
            };
            return entdto;
        }
    }
}