using langguanApi.Extensions.AutoDI;
using langguanApi.Model;
using Mapster;
using System.Linq.Expressions;
namespace langguanApi.Service
{
    /// 
    /// OrganizedService
    /// 
    [ServiceInjection(InjectionType.Transient)]
    public class OrganizedService : BaseService
    {
        private readonly DeviceService _deviceService;
        public OrganizedService(IConfiguration config, DeviceService device) : base(config, nameof(Organized))
        {
            _deviceService = device;
        }
        /// 
        /// Add 工序
        /// 
        /// 
        /// 
        public async Task Add(OrganizedDto input)
        {
            var entity = input.Adapt();
            await CreateAsync(entity);
            return new ApiResult() { code = 0 };
        }
        /// 
        /// Update
        /// 
        /// 
        /// 
        public async Task Update(OrganizedUpdateDto input)
        {
            var entity = input.Adapt();
            await UpdateAsync(input.Id, entity);
            return new ApiResult() { code = 0 };
        }
        /// 
        /// Delete
        /// 
        /// 
        /// 
        public async Task Delete(IEnumerable ids)
        {
            if (ids.Any())
            {
                foreach (var id in ids)
                {
                    await RemoveAsync(id);
                }
            }
            else
            {
                return new ApiResult() { code = 1, msg = "请选择要删除的记录" };
            }
            return new ApiResult() { code = 0 };
        }
        /// 
        /// ListAndDevice
        /// 
        /// 1,有组织,2无组织
        /// 
        public async Task ListAndDevice(int OrganizedType = 1)
        {
            Expression> exp = filter => filter.OrganizedType == OrganizedType && filter.IsDelete == false;
            var result = (await base.GetListWithExp(exp)).OrderByDescending(x => x.Order).ToList();
            List list = new List();
            var devices = await _deviceService.GetDeviceByOrgids(result.Select(s => s.Id));
            foreach (var item in result)
            {
                list.Add(new OrganizedByDeviceDto
                {
                    Items = devices.Where(s => s.OrgId == item.Id).ToList(),
                    Order = item.Order,
                    Name = item.Name,
                    OrganizedType = item.OrganizedType,
                    Id = item.Id
                });
            }
            return new ApiResult() { code = 0, data = list };
        }
        /// 
        /// List
        /// 
        /// 1,有组织,2无组织
        /// 
        public async Task List(int OrganizedType = 1)
        {
            Expression> exp = filter => filter.OrganizedType == OrganizedType && filter.IsDelete == false;
            var result = (await base.GetListWithExp(exp)).OrderByDescending(x => x.Order).ToList();
            return new ApiResult() { code = 0, data = result };
        }
    }
}