using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using PartSource.Data.Contexts; using PartSource.Data.Dtos; using PartSource.Data.Models; namespace PartSource.Services { public class FitmentService { private readonly FitmentContext _fitmentContext; public FitmentService(FitmentContext fitmentContext) { _fitmentContext = fitmentContext; } public IList GetYmmFitment(IList vehicles) { if (vehicles.Count == 0) { return new string[0]; } IList fitmentTags = new List(); IList makeModels = vehicles.OrderBy(v => v.MakeName).ThenBy(v => v.ModelName).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 GetYmmFitmentRange(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]; int minYear = vehicles .Where(v => v.MakeName == make && v.ModelName == model) .Min(v => v.Year); int maxYear = vehicles .Where(v => v.MakeName == make && v.ModelName == model) .Max(v => v.Year); string tag = minYear == maxYear ? $"{minYear} {make.Trim()} {model.Trim()}" : $"{minYear}-{maxYear} {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).Distinct().ToList(); } public IList GetVehiclesForPart(string partNumber, string lineCode, int maxVehicles = 0) { if (string.IsNullOrEmpty(partNumber) || string.IsNullOrEmpty(lineCode)) { return null; } partNumber = Regex.Replace(partNumber, "[^a-zA-Z0-9]", string.Empty); IQueryable whiCodes = _fitmentContext.DcfMappings .Where(d => d.LineCode == lineCode) .Select(d => d.WhiCode); IQueryable vehicles = _fitmentContext.Fitments .Where(f => f.PartNumber == partNumber && whiCodes.Contains(f.LineCode)) .Join(_fitmentContext.Vehicles, f => new { f.BaseVehicleId, f.EngineConfigId }, v => new { v.BaseVehicleId, v.EngineConfigId }, (f, v) => v) .Distinct() .OrderByDescending(x => x.Year); if (maxVehicles > 0) { vehicles = vehicles.Take(maxVehicles); } return vehicles.ToList(); } public IList GetVehicleFitmentForPart(string partNumber, string lineCode, int maxVehicles = 0) { if (string.IsNullOrEmpty(partNumber) || string.IsNullOrEmpty(lineCode)) { return null; } partNumber = Regex.Replace(partNumber, "[^a-zA-Z0-9\\-]", string.Empty); IQueryable whiCodes = _fitmentContext.DcfMappings .Where(d => d.LineCode == lineCode) .Select(d => d.WhiCode); IQueryable vehicles = _fitmentContext.Fitments .Where(f => f.PartNumber == partNumber && whiCodes.Contains(f.LineCode)) .Join(_fitmentContext.Vehicles, f => new { f.BaseVehicleId, f.EngineConfigId }, v => new { v.BaseVehicleId, v.EngineConfigId }, (f, v) => new VehicleFitmentDto { Fitment = f, Vehicle = v }) .Distinct(); if (maxVehicles > 0) { vehicles = vehicles.Take(maxVehicles); } return vehicles.ToList(); } } }