DEV Community

NOOB
NOOB

Posted on

1 Parking Lot System

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());
    }
}
Enter fullscreen mode Exit fullscreen mode

}

Top comments (0)