#include <iostream>
#include <vector>
#include <ctime>

using namespace std;

class Tour {
private:
    int tourID;
    string destination;
    int duration; // in days
    double price;
    string departureDate;
    string returnDate;
    int availability;

public:
    // Constructors
    Tour(int id, string dest, int dur, double prc, string depDate, string retDate, int avail)
        : tourID(id), destination(dest), duration(dur), price(prc), departureDate(depDate), returnDate(retDate), availability(avail) {}

    // Accessors
    int getTourID() const { return tourID; }
    string getDestination() const { return destination; }
    int getDuration() const { return duration; }
    double getPrice() const { return price; }
    string getDepartureDate() const { return departureDate; }
    string getReturnDate() const { return returnDate; }
    int getAvailability() const { return availability; }

    // Mutators
    void setPrice(double prc) { price = prc; }
    void setAvailability(int avail) { availability = avail; }
};

class Customer {
private:
    int customerID;
    string name;
    int age;
    char gender;
    string address;
    string email;
    string phoneNumber;

public:
    // Constructors
    Customer(int id, string nm, int ag, char gen, string addr, string mail, string phone)
        : customerID(id), name(nm), age(ag), gender(gen), address(addr), email(mail), phoneNumber(phone) {}

    // Accessors
    int getCustomerID() const { return customerID; }
    string getName() const { return name; }
    int getAge() const { return age; }
    char getGender() const { return gender; }
    string getAddress() const { return address; }
    string getEmail() const { return email; }
    string getPhoneNumber() const { return phoneNumber; }

    // Mutators
    void setAddress(string addr) { address = addr; }
    void setEmail(string mail) { email = mail; }
    void setPhoneNumber(string phone) { phoneNumber = phone; }
};

class Booking {
private:
    int bookingID;
    int customerID;
    int tourID;
    string bookingDate;
    int numAdults;
    int numChildren;
    double totalCost;

public:
    // Constructors
    Booking(int id, int custID, int tID, string bDate, int adults, int children, double cost)
        : bookingID(id), customerID(custID), tourID(tID), bookingDate(bDate), numAdults(adults), numChildren(children), totalCost(cost) {}

    // Accessors
    int getBookingID() const { return bookingID; }
    int getCustomerID() const { return customerID; }
    int getTourID() const { return tourID; }
    string getBookingDate() const { return bookingDate; }
    int getNumAdults() const { return numAdults; }
    int getNumChildren() const { return numChildren; }
    double getTotalCost() const { return totalCost; }

    // Mutators
    void setTotalCost(double cost) { totalCost = cost; }
};

int main() {
    // Test code
    Tour tour1(1, "Paris", 5, 1500.0, "2024-06-15", "2024-06-20", 20);
    cout << "Tour ID: " << tour1.getTourID() << endl;
    cout << "Destination: " << tour1.getDestination() << endl;
    cout << "Duration: " << tour1.getDuration() << " days" << endl;
    cout << "Price: $" << tour1.getPrice() << endl;
    cout << "Departure Date: " << tour1.getDepartureDate() << endl;
    cout << "Return Date: " << tour1.getReturnDate() << endl;
    cout << "Availability: " << tour1.getAvailability() << endl;

    Customer customer1(101, "John Doe", 30, 'M', "123 Main St", "john.doe@example.com", "123-456-7890");
    cout << "\nCustomer ID: " << customer1.getCustomerID() << endl;
    cout << "Name: " << customer1.getName() << endl;
    cout << "Age: " << customer1.getAge() << endl;
    cout << "Gender: " << customer1.getGender() << endl;
    cout << "Address: " << customer1.getAddress() << endl;
    cout << "Email: " << customer1.getEmail() << endl;
    cout << "Phone Number: " << customer1.getPhoneNumber() << endl;

    Booking booking1(1001, 101, 1, "2024-04-17", 2, 1, 4500.0);
    cout << "\nBooking ID: " << booking1.getBookingID() << endl;
    cout << "Customer ID: " << booking1.getCustomerID() << endl;
    cout << "Tour ID: " << booking1.getTourID() << endl;
    cout << "Booking Date: " << booking1.getBookingDate() << endl;
    cout << "Number of Adults: " << booking1.getNumAdults() << endl;
    cout << "Number of Children: " << booking1.getNumChildren() << endl;
    cout << "Total Cost: $" << booking1.getTotalCost() << endl;

    return 0;
}