import java.util.Random;
public class Customer {
private String userId;
private String userName;
private String email;
private String password;
private String address;
private String contactNumber;
public Customer(String userName, String email, String password, String address, String contactNumber) {
this.userId = generateUserId();
this.userName = userName;
this.email = email;
this.password = password;
this.address = address;
this.contactNumber = contactNumber;
}
private String generateUserId() {
Random random = new Random();
int id = 10000 + random.nextInt(90000); // 5-digit random number
return String.valueOf(id);
}
// ── Validation helpers ──────────────────────────────────────────
public static String validateUserName(String name) {
if (name == null || name.trim().isEmpty()) return "User name cannot be empty.";
if (name.length() > 50) return "User name cannot exceed 50 characters.";
return null;
}
public static String validateEmail(String email) {
if (email == null || email.trim().isEmpty()) return "Email cannot be empty.";
if (!email.matches("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"))
return "Invalid email format.";
return null;
}
public static String validatePassword(String password) {
if (password == null || password.trim().isEmpty()) return "Password cannot be empty.";
if (password.length() < 6) return "Password must be at least 6 characters.";
if (password.length() > 12) return "Password cannot exceed 12 characters.";
return null;
}
public static String validateAddress(String address) {
if (address != null && address.length() > 100)
return "Address cannot exceed 100 characters.";
return null;
}
public static String validateContactNumber(String contact) {
if (contact == null || contact.trim().isEmpty()) return "Contact number cannot be empty.";
if (contact.length() != 10 || !contact.matches("\\d{10}"))
return "Contact number must be exactly 10 digits.";
return null;
}
// ── Getters & Setters ───────────────────────────────────────────
public String getUserId() { return userId; }
public String getUserName() { return userName; }
public String getEmail() { return email; }
public String getPassword() { return password; }
public String getAddress() { return address; }
public String getContactNumber() { return contactNumber; }
public void setUserName(String userName) { this.userName = userName; }
public void setEmail(String email) { this.email = email; }
public void setPassword(String password) { this.password = password; }
public void setAddress(String address) { this.address = address; }
public void setContactNumber(String contactNumber) { this.contactNumber = contactNumber; }
@Override
public String toString() {
return String.format(
"┌──────────────────────────────────────┐%n" +
"│ CUSTOMER DETAILS │%n" +
"├──────────────────────────────────────┤%n" +
"│ User ID : %-23s│%n" +
"│ Name : %-23s│%n" +
"│ Email : %-23s│%n" +
"│ Address : %-23s│%n" +
"│ Contact : %-23s│%n" +
"└──────────────────────────────────────┘",
userId, userName, email, address, contactNumber
);
}
}
public class Train {
private String trainNumber;
private String trainName;
private String originStation;
private String destinationStation;
private String departureTime;
private String arrivalTime;
private int numberOfSeats;
private boolean[] seatAvailability; // true = available
public Train(String trainNumber, String trainName, String originStation,
String destinationStation, String departureTime, String arrivalTime,
int numberOfSeats) {
this.trainNumber = trainNumber;
this.trainName = trainName;
this.originStation = originStation;
this.destinationStation = destinationStation;
this.departureTime = departureTime;
this.arrivalTime = arrivalTime;
this.numberOfSeats = numberOfSeats;
this.seatAvailability = new boolean[numberOfSeats];
for (int i = 0; i < numberOfSeats; i++) {
seatAvailability[i] = true; // all seats initially available
}
}
// ── Seat management ─────────────────────────────────────────────
public boolean isSeatAvailable(int seatNumber) {
if (seatNumber < 1 || seatNumber > numberOfSeats) return false;
return seatAvailability[seatNumber - 1];
}
public boolean bookSeat(int seatNumber) {
if (!isSeatAvailable(seatNumber)) return false;
seatAvailability[seatNumber - 1] = false;
return true;
}
public void releaseSeat(int seatNumber) {
if (seatNumber >= 1 && seatNumber <= numberOfSeats) {
seatAvailability[seatNumber - 1] = true;
}
}
public int getAvailableSeatCount() {
int count = 0;
for (boolean available : seatAvailability) {
if (available) count++;
}
return count;
}
// ── Getters & Setters ───────────────────────────────────────────
public String getTrainNumber() { return trainNumber; }
public String getTrainName() { return trainName; }
public String getOriginStation() { return originStation; }
public String getDestinationStation() { return destinationStation; }
public String getDepartureTime() { return departureTime; }
public String getArrivalTime() { return arrivalTime; }
public int getNumberOfSeats() { return numberOfSeats; }
public void setTrainName(String trainName) { this.trainName = trainName; }
public void setOriginStation(String originStation) { this.originStation = originStation; }
public void setDestinationStation(String destinationStation) { this.destinationStation = destinationStation; }
public void setDepartureTime(String departureTime) { this.departureTime = departureTime; }
public void setArrivalTime(String arrivalTime) { this.arrivalTime = arrivalTime; }
/** Summary row for search results */
public String toSummary() {
return String.format("│ %-10s │ %-20s │ %-10s │ %-10s │ %3d avail │",
trainNumber, trainName, departureTime, arrivalTime, getAvailableSeatCount());
}
/** Detailed view */
@Override
public String toString() {
return String.format(
"┌──────────────────────────────────────────┐%n" +
"│ TRAIN DETAILS │%n" +
"├──────────────────────────────────────────┤%n" +
"│ Train No. : %-26s│%n" +
"│ Train Name : %-26s│%n" +
"│ Origin : %-26s│%n" +
"│ Destination : %-26s│%n" +
"│ Departure : %-26s│%n" +
"│ Arrival : %-26s│%n" +
"│ Total Seats : %-26d│%n" +
"│ Available : %-26d│%n" +
"└──────────────────────────────────────────┘",
trainNumber, trainName, originStation, destinationStation,
departureTime, arrivalTime, numberOfSeats, getAvailableSeatCount()
);
}
}
import java.time.LocalDate;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
public class Booking {
public enum Status { CONFIRMED, CANCELLED }
private String bookingId;
private String customerId;
private String trainNumber;
private List<Integer> seatNumbers;
private LocalDate bookingDate;
private double fare;
private Status bookingStatus;
public Booking(String customerId, String trainNumber, List<Integer> seatNumbers, double fare) {
this.bookingId = generateBookingId();
this.customerId = customerId;
this.trainNumber = trainNumber;
this.seatNumbers = seatNumbers;
this.bookingDate = LocalDate.now();
this.fare = fare;
this.bookingStatus = Status.CONFIRMED;
}
private String generateBookingId() {
Random random = new Random();
return "BKG" + (10000 + random.nextInt(90000));
}
// ── Getters ─────────────────────────────────────────────────────
public String getBookingId() { return bookingId; }
public String getCustomerId() { return customerId; }
public String getTrainNumber() { return trainNumber; }
public List<Integer> getSeatNumbers(){ return seatNumbers; }
public LocalDate getBookingDate() { return bookingDate; }
public double getFare() { return fare; }
public Status getBookingStatus() { return bookingStatus; }
public void cancel() { this.bookingStatus = Status.CANCELLED; }
@Override
public String toString() {
String seats = seatNumbers.stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));
return String.format(
"┌──────────────────────────────────────────┐%n" +
"│ BOOKING CONFIRMATION │%n" +
"├──────────────────────────────────────────┤%n" +
"│ Booking ID : %-26s│%n" +
"│ Customer ID : %-26s│%n" +
"│ Train No. : %-26s│%n" +
"│ Seat(s) : %-26s│%n" +
"│ Booking Date: %-26s│%n" +
"│ Fare : ₹ %-24.2f│%n" +
"│ Status : %-26s│%n" +
"└──────────────────────────────────────────┘",
bookingId, customerId, trainNumber, seats,
bookingDate, fare, bookingStatus
);
}
}