using System; using JdpVehicle; using Serilog; using LCU.Shared.Collections.RepoApiLib.Utilities; using Newtonsoft.Json; using LCU.Shared.Collections.RepoApiLib.Models.Results; namespace LCU.Shared.Collections.RepoApiLib.WebServices.NADA { public class CollateralValueService : ICollateralValueService { private readonly CollateralValueServiceConfig _config; private readonly IClientHelpers _clientHelpers; public CollateralValueService(CollateralValueServiceConfig config, ClientHelpers clientHelpers) { _config = config; _clientHelpers = clientHelpers; } private readonly VehicleTypes[] _nadaVehicleType = { VehicleTypes.UsedCar, VehicleTypes.CommercialTruck }; public CollateralValuation GetCollateralValue(string vin, int mileage, int vehicleTypeKey) { var valueResponse = this.GetVehicleData(_config.Region, _config.Period, vin, vehicleTypeKey, mileage); if (valueResponse != null) { var autoVehicle = new CollateralValuation() { Make = valueResponse.Make, Model = valueResponse.Body + " " + valueResponse.Model, Year = valueResponse.Modelyear, UcgVehicleId = valueResponse.Ucgvehicleid.ToString(), //ucgvehicleid is the new ID and not 1:1 to legacy UID SeriesDescription = valueResponse.Model, BodyDescription = valueResponse.Body, Weight = String.IsNullOrWhiteSpace(valueResponse.Curbweight) ? 0 : Int32.Parse(valueResponse.Curbweight), Msrp = String.IsNullOrWhiteSpace(valueResponse.Basemsrp) ? 0 : Int32.Parse(valueResponse.Basemsrp), AveMileage = valueResponse.Averagemileage, MileageAdjustment = valueResponse.Mileageadjustment, LookupDate = DateTime.Now, Loan = valueResponse.Baseloan, LoanPlusVinAccMileage = valueResponse.Adjustedloan, Retail = valueResponse.Basecleanretail, RetailPlusVinAccMileage = valueResponse.Adjustedcleanretail, AvgTradeIn = valueResponse.Baseaveragetrade, AvgTradeInPlusVinAccMileage = valueResponse.Adjustedaveragetrade, RoughTradeIn = valueResponse.Baseroughtrade, RoughTradeInPlusVinAccMileage = valueResponse.Adjustedroughtrade, TradeIn = valueResponse.Basecleantrade, TradeInPlusVinAccMileage = valueResponse.Adjustedcleantrade, AuctionInfoUnavailable = true }; //Try catch to prevent failure if no auction values available try { var auctionResponse = this.GetAuctionValues(_config.Period, valueResponse.Ucgvehicleid, _config.Region, vehicleTypeKey, vin, mileage); if (auctionResponse != null) { autoVehicle.AuctionInfoUnavailable = false; autoVehicle.AverageAdjustedAuctionValue = auctionResponse.AvgAuction; autoVehicle.HighAdjustedAuctionValue = auctionResponse.HighAuction; autoVehicle.LowAdjustedAuctionValue = auctionResponse.LowAuction; autoVehicle.DateRange = auctionResponse.DateRange; } } catch (Exception ex) { Log.Error(ex, "Failed to Retreive Auction Values in CollateralValueService"); } return autoVehicle; } return null; } private VehicleData GetVehicleData(int region, int period, string vin, int vehicleTypeKey, int mileage) { var newURL = string.Format(_config.DefaultVehicleAndValuesByVinEndpoint + "?period={0}&vin={1}®ion={2}&mileage={3}", period, vin, region, mileage); var request = _clientHelpers.CreateGetHttpRequestMessage(newURL, _config.ApiKey); var response = _clientHelpers.SendHttpRequestMessage(request); if (!response.IsSuccessStatusCode) { throw new Exception($"Request for vehicle data for vehicle with VIN {vin} was unsuccessful."); } var content = response.Content.ReadAsStringAsync().Result; var result = JsonConvert.DeserializeObject(content); return result.Result[0]; } private AuctionData GetAuctionValues(int period, int ucgVehicleId, int region, int vehicleTypeKey, string vin, int mileage) { var newURL = string.Format(_config.WeeklyAuctionValuesByVehicleIdEndPoint + "?period={0}&vehicletype={1}&vin={2}&ucgvehicleid={3}®ion={4}&mileage={5}", period, this._nadaVehicleType[vehicleTypeKey], vin, ucgVehicleId, region, mileage); var request = _clientHelpers.CreateGetHttpRequestMessage(newURL, _config.ApiKey); var response = _clientHelpers.SendHttpRequestMessage(request); if (!response.IsSuccessStatusCode) { throw new Exception($"Request for auction data for vehicle with VIN {vin} was unsuccessful."); } var content = response.Content.ReadAsStringAsync().Result; var result = JsonConvert.DeserializeObject(content); return result.Result[0]; } } }