using Microsoft.AspNetCore.Http; using POCDistance.DAL; using POCDistance.Models; using POCDistance.Util; using System.Collections.Generic; using System.Linq; namespace POCDistance.Service { public class LocationService : ILocationService { private readonly IHttpContextAccessor _httpContextAccessor; private readonly IDataSourceAdapter _dataAdapter; public LocationService(IHttpContextAccessor httpContextAccessor, IDataSourceAdapter dataAdapter) { _httpContextAccessor = httpContextAccessor; _dataAdapter = dataAdapter; } public List GetAll() { var locations = new List(); if (!string.IsNullOrEmpty(_httpContextAccessor.HttpContext.Session.GetString("LocationData"))) { locations = _httpContextAccessor.HttpContext.Session.GetObjectFromJson>("LocationData"); } else { locations = _dataAdapter.GetLocations(); _httpContextAccessor.HttpContext.Session.SetObjectAsJson("LocationData", locations); } return locations; } public List GetManyByZipCode(string zipCode) { if (!string.IsNullOrWhiteSpace(zipCode) && zipCode.Length > 1) { var locations = GetAll(); var query = locations.Where(l => l.ZipCode.StartsWith(zipCode)); return query.ToList(); } return new List(); } public LocationModel GetByZipCode(string zipCode) { var _location = GetManyByZipCode(zipCode); return _location.OrderByDescending(l => l.Country).FirstOrDefault(); } public DistanceModel GetDistanceByZipCode(string zipCode1, string zipCode2) { double distance = 0.0; double loc_lat1, loc_long1, loc_lat2, loc_long2; var model = new DistanceModel(); var location1 = GetByZipCode(zipCode1); var location2 = GetByZipCode(zipCode2); if (location1 != null && location2 != null && double.TryParse(location1.Latitude, out loc_lat1) && double.TryParse(location1.Longitude, out loc_long1) && double.TryParse(location2.Latitude, out loc_lat2) && double.TryParse(location2.Longitude, out loc_long2)) { distance = CalculateDistance.GetDistance(loc_lat1, loc_long1, loc_lat2, loc_long2); model.Distance = distance.ToString("0.00"); model.FromCity = location1.City; model.ToCity = location2.City; model.Unit = "km"; } return model; } } }