Skip to content
Snippets Groups Projects
FlightService.cs 4 KiB
Newer Older
using FlightMicroservice.Models;
using Microsoft.EntityFrameworkCore;

namespace FlightMicroservice.Services
{
    public class FlightService : IFlightService
    {
        private readonly ApplicationDbContext dbContext;

        public FlightService(ApplicationDbContext dbContext)
        {
            this.dbContext = dbContext;
        }

        public Flight? GetFlight(int flightId)
        {
            Flight? flight = dbContext.Flights.SingleOrDefault(flight => flight.Id == flightId);
            return flight;
        }

        public List<Flight> GetFlights(int? airlineId, string? origin, string? destination, DateTime? departureTime, DateTime? arrivalTime)
        {
            IQueryable<Flight> query = dbContext.Flights.AsQueryable();

            if(airlineId != null)
                query = query.Where(flight => flight.AirlineId == airlineId);

            if (!string.IsNullOrWhiteSpace(origin))
                query = query.Where(flight => flight.Origin == origin);

            if (!string.IsNullOrWhiteSpace(destination))
                query = query.Where(flight => flight.Destination == destination);

            if (departureTime.HasValue)
                query = query.Where(flight => flight.DepartureTime.Date == departureTime.Value.Date);

            if (arrivalTime.HasValue)
                query = query.Where(flight => flight.ArrivalTime.Date == arrivalTime.Value.Date);

            return query.ToList();
        }

        public Flight CreateFlight(
            int airlineId,
            string origin, 
            string destination, 
            DateTime departureTime, 
            DateTime arrivalTime, 
            int economyCapacity, 
            int businessCapacity, 
            decimal economyPrice, 
            decimal businessPrice)
        {
            Flight flight = new Flight(airlineId, origin, destination, departureTime, arrivalTime, economyCapacity, businessCapacity, economyPrice, businessPrice);

            InitializeSeatsForFlight(flight);

            dbContext.Flights.Add(flight);
            dbContext.SaveChanges();

            return flight;
        }

        public bool RemoveFlight(int flightId) 
        { 
            Flight? flight = dbContext.Flights.SingleOrDefault(flight => flight.Id == flightId);
            if (flight == null)
                return false;

            dbContext.Flights.Remove(flight);
            dbContext.SaveChanges();

            return true;
        }

        public List<Seat> GetSeatsByFlightId(int flightId)
        {
            return dbContext.Seats
                .Where(seat => seat.FlightId == flightId) 
                .ToList();
        }

        private void InitializeSeatsForFlight(Flight flight)
        {
            int businessRows = flight.BusinessCapacity / Flight.BUSINESS_SEATS_PER_ROW;
            int economyRows = flight.EconomyCapacity / Flight.ECONOMY_SEATS_PER_ROW;

            // Initialize Business class seats
            for (int row = 1; row <= businessRows; row++)
            {
                for (char seat = 'A'; seat < 'A' + Flight.BUSINESS_SEATS_PER_ROW; seat++)
                {
                    flight.Seats.Add(new Seat
                    {
                        ClassType = ClassType.BUSINESS,
                        SeatNumber = $"{row}{seat}",
                        IsAvailable = true
                    });
                }
            }

            // Initialize Economy class seats
            int startingEconomyRow = businessRows + 1; // Economy rows start after the last Business row
            for (int row = startingEconomyRow; row < startingEconomyRow + economyRows; row++)
            {
                for (char seat = 'A'; seat < 'A' + Flight.ECONOMY_SEATS_PER_ROW; seat++)
                {
                    flight.Seats.Add(new Seat
                    {
                        ClassType = ClassType.ECONOMY,
                        SeatNumber = $"{row}{seat}",
                        IsAvailable = true
                    });
                }
            }
        }

    }


}