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()); } } }