package LLD.parkingLotSystem;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class ParkingLotSystem {
enum VehicleType {
BIKE, CAR, TRUCK
}
class Vehicle {
String number;
VehicleType type;
Vehicle(String number, VehicleType type) {
this.number = number;
this.type = type;
}
}
class ParkingSpot {
int id;
VehicleType type;
Vehicle vehicle;
ParkingSpot(int id, VehicleType type) {
this.id = id;
this.type = type;
}
boolean canFit(Vehicle vehicle) {
return this.vehicle == null && this.type == vehicle.type;
}
void park(Vehicle vehicle) {
if (!canFit(vehicle)) {
throw new IllegalStateException("Invalid Spot");
}
this.vehicle = vehicle;
}
void remove() {
vehicle = null;
}
}
class ParkingFloor {
int floorNumber;
List<ParkingSpot> spots = new ArrayList<>();
ParkingFloor(int floorNumber) {
this.floorNumber = floorNumber;
}
ParkingSpot findSpot(Vehicle vehicle) {
for (ParkingSpot spot : spots) {
if (spot.canFit(vehicle)) {
return spot;
}
}
return null;
}
}
class Ticket {
String id;
Vehicle vehicle;
ParkingSpot spot;
long entryTime;
Ticket(Vehicle vehicle, ParkingSpot spot) {
this.id = UUID.randomUUID().toString();
this.vehicle = vehicle;
this.spot = spot;
this.entryTime = System.currentTimeMillis();
}
}
class ParkingLot {
List<ParkingFloor> floors = new ArrayList<>();
Ticket park(Vehicle vehicle) {
for (ParkingFloor floor : floors) {
ParkingSpot spot = floor.findSpot(vehicle);
if (spot != null) {
spot.park(vehicle);
return new Ticket(vehicle, spot);
}
}
throw new IllegalStateException("Parking full");
}
}
double exit(Ticket ticket) {
long duration = System.currentTimeMillis() - ticket.entryTime;
long hours = Math.max(1, (duration + 3600000 - 1) / 3600000);
double rate = switch (ticket.vehicle.type) {
case BIKE -> 20;
case CAR -> 40;
case TRUCK -> 80;
};
ticket.spot.remove();
return hours*rate;
}
public static void main(String[] args) {
ParkingLotSystem system = new ParkingLotSystem();
ParkingLot lot = system.new ParkingLot();
ParkingFloor floor1 = system.new ParkingFloor(1);
floor1.spots.add(system.new ParkingSpot(101, VehicleType.BIKE));
floor1.spots.add(system.new ParkingSpot(102, VehicleType.CAR));
floor1.spots.add(system.new ParkingSpot(103, VehicleType.TRUCK));
lot.floors.add(floor1);
System.out.println("Parking Lot Setup complete");
Vehicle myCar = system.new Vehicle("KA-01-KX-2881", VehicleType.CAR);
Vehicle myBike = system.new Vehicle("KA-01-KX-1068", VehicleType.BIKE);
try {
System.out.println("\nAttempting to park Car: " + myCar.number);
Ticket carTicket = lot.park(myCar);
System.out.println("Car parked successfully! Ticket ID: " + carTicket.id + " at Spot: " + carTicket.spot.id);
System.out.println("Attempting to park Bike: " + myBike.number);
Ticket bikeTicket = lot.park(myBike);
System.out.println("Bike parked successfully! Ticket ID: " + bikeTicket.id + " at Spot: " + bikeTicket.spot.id);
System.out.println("\nExiting Car: " + myCar.number);
double carFee = system.exit(carTicket);
System.out.println("Car exit successful. Total Fee: ₹" + carFee);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
Top comments (0)