DROP TABLE BookingGuest;
DROP TABLE BookingRoom CASCADE CONSTRAINTS;
DROP TABLE Booking;
DROP TABLE CleaningClerk;
DROP TABLE CleaningPlan CASCADE CONSTRAINTS;
DROP TABLE Client;
DROP TABLE Clerk;
DROP TABLE Person;
DROP TABLE Room;
DROP TABLE Address;
DROP SEQUENCE address_seq;
DROP SEQUENCE room_seq;
DROP SEQUENCE person_seq;
DROP SEQUENCE cleaningPlan_seq;
DROP SEQUENCE booking_seq;

CREATE TABLE Address
(
    addressId NUMBER PRIMARY KEY,
    street VARCHAR2(50) NOT NULL,
    houseNumber NUMBER NOT NULL,
    postalCode NUMBER NOT NULL,
    city VARCHAR2(50) NOT NULL,
    country VARCHAR2(50) NOT NULL
);

CREATE TABLE Room
(
    roomNumber NUMBER PRIMARY KEY,
    floor NUMBER NOT NULL,
    roomTyp VARCHAR2(50) NOT NULL,
    "size" NUMBER NOT NULL,
    accessibility NUMBER NOT NULL,
    beds NUMBER NOT NULL
);

CREATE TABLE Person
(
    personId NUMBER PRIMARY KEY,
    name VARCHAR2(50) NOT NULL,
    lastName VARCHAR2(50) NOT NULL,
    age NUMBER NOT NULL,
    addressId NUMBER NOT NULL,
    FOREIGN KEY (addressId) REFERENCES Address(addressId)
);

CREATE TABLE Clerk
(
    personId NUMBER PRIMARY KEY,
    staff NUMBER NOT NULL UNIQUE,
    salary NUMBER NOT NULL,
    FOREIGN KEY (personId) REFERENCES Person(personId)
);

CREATE TABLE Client
(
    personId NUMBER PRIMARY KEY,
    bankDetails VARCHAR2(22) NOT NULL,
    FOREIGN KEY (personId) REFERENCES Person(personId)
);

CREATE  TABLE CleaningPlan
(
    cleaningPlanId NUMBER PRIMARY KEY,
    "date" DATE NOT NULL,
    duration NUMBER NOT NULL,
    roomNUMBER NUMBER NOT NULL,
    FOREIGN KEY (roomNUMBER) REFERENCES ROOM(roomNumber)
);

CREATE TABLE CleaningClerk
(
    clerkId NUMBER,
    cleaningPlanId NUMBER,
    PRIMARY KEY (clerkId,cleaningPlanId),
    FOREIGN KEY (clerkId) REFERENCES Clerk(personId),
    FOREIGN KEY (cleaningPlanId) REFERENCES CleaningPlan(cleaningPlanId)
);

CREATE TABLE Booking (
    bookingId NUMBER PRIMARY KEY,
    arrivalDate DATE NOT NULL,
    departureDate DATE NULL,
    cost NUMBER NULL,
    pensionType VARCHAR2(50) NOT NULL,
    lateCheckout NUMBER NULL,
    clientId NUMBER NOT NULL,
    FOREIGN KEY (clientId) REFERENCES Client(personId)
);

CREATE TABLE BookingGuest (
    bookingId NUMBER NOT NULL,
    personId NUMBER NOT NULL,
    PRIMARY KEY(bookingId, personId),
    FOREIGN KEY (bookingId) REFERENCES Booking(bookingId) ON DELETE CASCADE,
    FOREIGN KEY (personId) REFERENCES Person(personId)
);

CREATE TABLE BookingRoom (
    bookingId NUMBER NOT NULL,
    roomNumber NUMBER NOT NULL,
    PRIMARY KEY(bookingId, roomNumber),
    FOREIGN KEY (bookingId) REFERENCES Booking(bookingId) ON DELETE CASCADE,
    FOREIGN KEY (roomNumber) REFERENCES Room(roomNumber)
);

CREATE SEQUENCE address_seq;
CREATE SEQUENCE room_seq;
CREATE SEQUENCE person_seq;
CREATE SEQUENCE cleaningPlan_seq;
CREATE SEQUENCE booking_seq;