using Dal.ApplicationStorage.DataAccess.Abstract; using Microsoft.CodeAnalysis; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Microsoft.Win32; using Models.DatabaseModels; using Models.DataTransferObjects.Serach; using Models.JSON; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Dal.ApplicationStorage.DataAccess.Concrete { public class SearchDa : ISearchDa { private readonly ApiContext _db; private static ILogger _logger; public SearchDa(ApiContext db, ILogger logger) { _db = db; _logger = logger; } public async Task> GetLocations() { try { var citiesFromDb = await _db.Locations.ToListAsync(); List cities = new List(); foreach(var city in citiesFromDb) { cities.Add(new SearchLocationDTO() { CityName = city.City, }); } return cities.DistinctBy(x => x.CityName).ToList(); } catch (Exception e) { _logger.LogError(e.Message); throw; } } public async Task> GetVehicleBrands() { try { var brandsFromDb = await _db.Vehicles.ToListAsync(); List brands = new List(); foreach(var brand in brandsFromDb) { brands.Add(new SearchBrandsDTO() { BrandName = brand.Brand }); } return brands.DistinctBy(x => x.BrandName).ToList(); } catch (Exception e) { _logger.LogError(e.Message); throw; } } public async Task> GetVehiclesBySearchParameters(SearchJSON data) { try { var query = await (from vehicles in _db.Vehicles join locations in _db.Locations on vehicles.LocationId equals locations.LocationId join models in _db.Models on vehicles.ModelId equals models.ModelId join registrations in _db.Registrations on vehicles.RegistrationId equals registrations.RegistrationId join companies in _db.Companies on vehicles.CompanyId equals companies.CompanyId select new CarsDTO() { CarId = vehicles.VehicleId, Brand = vehicles.Brand, Model = models.ModelName, Color = models.Color, ModelYear = models.ModelYear.Year, NumSeats = models.NumOfSeats, NumOfDoors = models.NumOfDoors, Fuel = models.Fuel, Transmission = models.Transmission, FuelEfficiency = vehicles.FuelEfficiency, DailyRentalPrice = (double)vehicles.DailyRentalPrice, City = locations.City, IsAvailable = registrations.IsAvailable, ImgUrl = models.ImgUrl, CompanyName = companies.CompanyName } ).Where(x => x.Brand == data.Brand && x.City == data.City && x.IsAvailable) .ToListAsync(); return query; } catch (Exception e) { _logger.LogError(e.Message); throw; } } public async Task> GetAllVehicles() { try { var query = await (from vehicles in _db.Vehicles join locations in _db.Locations on vehicles.LocationId equals locations.LocationId join models in _db.Models on vehicles.ModelId equals models.ModelId join registrations in _db.Registrations on vehicles.RegistrationId equals registrations.RegistrationId join companies in _db.Companies on vehicles.CompanyId equals companies.CompanyId select new CarsDTO() { CarId = vehicles.VehicleId, Brand = vehicles.Brand, Model = models.ModelName, Color = models.Color, ModelYear = models.ModelYear.Year, NumSeats = models.NumOfSeats, NumOfDoors = models.NumOfDoors, Fuel = models.Fuel, Transmission = models.Transmission, FuelEfficiency = vehicles.FuelEfficiency, DailyRentalPrice = (double)vehicles.DailyRentalPrice, City = locations.City, IsAvailable = registrations.IsAvailable, ImgUrl = models.ImgUrl, CompanyName = companies.CompanyName } ).Where(x => x.IsAvailable) .ToListAsync(); return query; } catch (Exception e) { _logger.LogError(e.Message); throw; } } public async Task> GetVehilcesByLocation(SearchJSON data) { try { var query = await (from vehicles in _db.Vehicles join locations in _db.Locations on vehicles.LocationId equals locations.LocationId join models in _db.Models on vehicles.ModelId equals models.ModelId join registrations in _db.Registrations on vehicles.RegistrationId equals registrations.RegistrationId join companies in _db.Companies on vehicles.CompanyId equals companies.CompanyId select new CarsDTO() { CarId = vehicles.VehicleId, Brand = vehicles.Brand, Model = models.ModelName, Color = models.Color, ModelYear = models.ModelYear.Year, NumSeats = models.NumOfSeats, NumOfDoors = models.NumOfDoors, Fuel = models.Fuel, Transmission = models.Transmission, FuelEfficiency = vehicles.FuelEfficiency, DailyRentalPrice = (double)vehicles.DailyRentalPrice, City = locations.City, IsAvailable = registrations.IsAvailable, ImgUrl = models.ImgUrl, CompanyName = companies.CompanyName } ).Where(x => x.City == data.City && x.IsAvailable) .ToListAsync(); return query; } catch (Exception e) { _logger.LogError(e.Message); throw; } } public async Task> GetVehiclesByBrand(SearchJSON data) { try { var query = await (from vehicles in _db.Vehicles join locations in _db.Locations on vehicles.LocationId equals locations.LocationId join models in _db.Models on vehicles.ModelId equals models.ModelId join registrations in _db.Registrations on vehicles.RegistrationId equals registrations.RegistrationId join companies in _db.Companies on vehicles.CompanyId equals companies.CompanyId select new CarsDTO() { CarId = vehicles.VehicleId, Brand = vehicles.Brand, Model = models.ModelName, Color = models.Color, ModelYear = models.ModelYear.Year, NumSeats = models.NumOfSeats, NumOfDoors = models.NumOfDoors, Fuel = models.Fuel, Transmission = models.Transmission, FuelEfficiency = vehicles.FuelEfficiency, DailyRentalPrice = (double)vehicles.DailyRentalPrice, City = locations.City, IsAvailable = registrations.IsAvailable, ImgUrl = models.ImgUrl, CompanyName = companies.CompanyName } ).Where(x => x.Brand == data.Brand.Trim() && x.IsAvailable) .ToListAsync(); return query; } catch (Exception e) { _logger.LogError(e.Message); throw; } } } }