using AutoMapper; using Microsoft.EntityFrameworkCore; using PartSource.Data; using PartSource.Data.Dtos; using PartSource.Data.Models; using PartSource.Services.Extensions; using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace PartSource.Services { public class VehicleService { private readonly IMapper _mapper; private readonly PartSourceContext _partSourceContext; public VehicleService(IMapper mapper, PartSourceContext partSourceContext) { _mapper = mapper; _partSourceContext = partSourceContext; } public async Task> GetVehicles(VehicleDto vehicleQuery) { return await _partSourceContext.Vehicles .ApplyQueryDto(vehicleQuery) .ToListAsync(); } public async Task GetVehicleById(int vehicleToEngineConfigId) { return await _partSourceContext.Vehicles .FirstOrDefaultAsync(v => v.VehicleToEngineConfigId == vehicleToEngineConfigId); } public async Task> GetMakes(VehicleDto vehicleQuery) { return await _partSourceContext.Vehicles .ApplyQueryDto(vehicleQuery) .Select(v => new MakeDto { MakeId = v.MakeId, MakeName = v.MakeName }) .Distinct() .OrderBy(v => v.MakeName) .ToListAsync(); } public async Task GetMakeById(int makeId) { Vehicle vehicle = await _partSourceContext.Vehicles .Where(v => v.MakeId == makeId) .FirstOrDefaultAsync(); return _mapper.Map(vehicle); } public async Task> GetModels(VehicleDto vehicleQuery) { return await _partSourceContext.Vehicles .ApplyQueryDto(vehicleQuery) .Select(v => new ModelDto { ModelId = v.ModelId, ModelName = v.ModelName, MakeId = v.MakeId, MakeName = v.MakeName }) .Distinct() .OrderBy(m => m.ModelName) .ToListAsync(); } public async Task GetModelById(int modelId) { Vehicle vehicle = await _partSourceContext.Vehicles .Where(m => m.ModelId == modelId) .FirstOrDefaultAsync(); return _mapper.Map(vehicle); } public async Task> GetBaseVehicles(VehicleDto vehicleQuery) { return await _partSourceContext.Vehicles .ApplyQueryDto(vehicleQuery) .Select(v => new BaseVehicleDto { BaseVehicleId = v.BaseVehicleId, MakeName = v.MakeName, MakeId = v.MakeId, ModelName = v.ModelName, ModelId = v.ModelId, Year = v.Year }) .Distinct() .ToListAsync(); } public async Task GetBaseVehicleById(int baseVehicleId) { Vehicle vehicle = await _partSourceContext.Vehicles .Where(b => b.BaseVehicleId == baseVehicleId) .FirstOrDefaultAsync(); return _mapper.Map(vehicle); } public async Task> GetEngines(VehicleDto vehicleQuery) { return await _partSourceContext.Vehicles .ApplyQueryDto(vehicleQuery) .Select(v => new EngineDto { EngineConfigId = v.EngineConfigId, EngineDescription = v.EngineDescription, MakeName = v.MakeName, MakeId = v.MakeId }) .Distinct() .ToListAsync(); } public async Task GetEngineById(int engineConfigId) { Vehicle vehicle = await _partSourceContext.Vehicles .Where(e => e.EngineConfigId == engineConfigId) .FirstOrDefaultAsync(); return _mapper.Map(vehicle); } public async Task> GetSubmodels(VehicleDto vehicleQuery) { return await _partSourceContext.Vehicles .ApplyQueryDto(vehicleQuery) .GroupBy(v => new { v.SubmodelId, v.SubmodelName, v.MakeId, v.MakeName }) .Select(v => new SubmodelDto { SubmodelId = v.Key.SubmodelId, SubmodelName = v.Key.SubmodelName, MakeId = v.Key.MakeId, MakeName = v.Key.MakeName }) .Distinct() .ToListAsync(); } public async Task GetSubmodelById(int submodelId) { Vehicle vehicle = await _partSourceContext.Vehicles .Where(s => s.SubmodelId == submodelId) .FirstOrDefaultAsync(); return _mapper.Map(vehicle); } #region Legacy API Support [Obsolete] public async Task GetVehicle(int baseVehicleId, int engineConfigId, int submodelId) { return await _partSourceContext.Vehicles.FirstOrDefaultAsync(d => d.BaseVehicleId == baseVehicleId && d.EngineConfigId == engineConfigId && d.SubmodelId == submodelId ); } [Obsolete] public async Task> GetSubmodels(int makeId, int modelId, int year) { return await _partSourceContext.Submodels.Where(s => s.MakeId == makeId && s.ModelId == modelId && s.Year == year ) .ToListAsync(); } [Obsolete] public async Task> GetEngines(int baseVehicleId) { return await _partSourceContext.Engines.Where(e => e.BaseVehicleId == baseVehicleId).ToListAsync(); } [Obsolete] public async Task> GetEngines(int baseVehicleId, int submodelId) { return await _partSourceContext.Engines.Where(e => e.BaseVehicleId == baseVehicleId && e.SubmodelId == submodelId ) .ToListAsync(); } [Obsolete] public async Task GetBaseVehicle(int makeId, int modelId, int year) { return await _partSourceContext.BaseVehicles.FirstOrDefaultAsync(d => d.MakeId == makeId && d.ModelId == modelId && d.Year == year ); } [Obsolete] public async Task> GetModels(int makeId, int year) { return await _partSourceContext.VehicleModels .Where(m => m.MakeId == makeId && m.Year == year ) .OrderBy(d => d.Name) .ToListAsync(); } [Obsolete] public async Task> GetMakes() { return await _partSourceContext.VehicleMakes .OrderBy(m => m.Name) .ToListAsync(); } #endregion public IList GetYmmFitment(IList vehicles) { if (vehicles.Count == 0) { return new string[0]; } IList fitmentTags = new List(); IList makeModels = vehicles.Select(v => $"{v.MakeName},{v.ModelName}").Distinct().ToList(); foreach (string makeModel in makeModels) { string make = makeModel.Split(',')[0]; string model = makeModel.Split(',')[1]; List years = vehicles .Where(v => v.MakeName == make && v.ModelName == model) .OrderBy(v => v.Year) .Select(v => v.Year.ToString().Trim()) .Distinct() .ToList(); string tag = $"{string.Join('-', years)} {make.Trim()} {model.Trim()}"; System.Diagnostics.Debug.WriteLine(tag); fitmentTags.Add(tag); } return fitmentTags; } public IList GetVehicleIdFitment(IList vehicles) { return vehicles.Select(v => v.VehicleToEngineConfigId).ToArray(); } public IList GetVehiclesForPart(string partNumber, string lineCode) { return GetVehiclesForPart(partNumber, lineCode, -1); } public IList GetVehiclesForPart(string partNumber, string lineCode, int maxVehicles) { if (string.IsNullOrEmpty(partNumber) || string.IsNullOrEmpty(lineCode)) { return null; } partNumber = Regex.Replace(partNumber, "[^a-zA-Z0-9]", string.Empty); IQueryable whiCodes = _partSourceContext.DcfMappings .Where(d => d.LineCode == lineCode) .Select(d => d.WhiCode); IQueryable vehicles = _partSourceContext.Fitments .Where(f => f.PartNumber == partNumber && whiCodes.Contains(f.LineCode)) .Join(_partSourceContext.Vehicles, f => new { f.BaseVehicleId, f.EngineConfigId }, v => new { v.BaseVehicleId, v.EngineConfigId }, (f, v) => v); if (maxVehicles > 0) { vehicles = vehicles.Take(maxVehicles); } return vehicles.ToList(); } } }