-- Create table "Genres" to store movie genres

CREATE TABLE genres (
    genre_id INTEGER PRIMARY KEY AUTOINCREMENT,
    genre_name TEXT NOT NULL UNIQUE CHECK(length(genre_name) > 0), -- Genre name cannot be empty
    CONSTRAINT no_double_spaces_in_genre_name CHECK (genre_name NOT LIKE '%  %') -- Genre name cannot contain double spaces
);

-- Create table "Movies" to store movie details

CREATE TABLE movies (
    movie_id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL UNIQUE CHECK(length(title) > 0), -- Movie title cannot be empty
    genre_id INTEGER,
    duration INTEGER CHECK(duration > 0), -- Movie duration must be greater than 0
    FOREIGN KEY (genre_id) REFERENCES genres (genre_id) ON DELETE CASCADE,
    CONSTRAINT no_double_spaces_in_title CHECK (title NOT LIKE '%  %') -- Movie title cannot contain double spaces
);

-- Create table "Halls" to store cinema hall details

CREATE TABLE halls (
    hall_id INTEGER PRIMARY KEY AUTOINCREMENT,
    hall_name TEXT NOT NULL UNIQUE CHECK(length(hall_name) > 0), -- Hall name cannot be empty
    capacity INTEGER NOT NULL CHECK(capacity > 0), -- Hall capacity must be positive
    CONSTRAINT no_double_spaces_in_hall_name CHECK (hall_name NOT LIKE '%  %') -- Hall name cannot contain double spaces
);

-- Create table "Sessions" to store session details

CREATE TABLE sessions (
    session_id INTEGER PRIMARY KEY AUTOINCREMENT,
    movie_id INTEGER,
    hall_id INTEGER,
    begin_at TIMESTAMP NOT NULL, -- Date and time of the session
    ticket_price REAL NOT NULL CHECK(ticket_price >= 0), -- Ticket price cannot be negative
    FOREIGN KEY (movie_id) REFERENCES movies (movie_id) ON DELETE CASCADE,
    FOREIGN KEY (hall_id) REFERENCES halls (hall_id) ON DELETE CASCADE,
    CONSTRAINT unique_hall_time UNIQUE (hall_id, begin_at) -- Prevent duplicate sessions in the same hall at the same time
);

-- Create table "Tickets" to store sold tickets

CREATE TABLE tickets (
    ticket_id INTEGER PRIMARY KEY AUTOINCREMENT,
    session_id INTEGER,
    seat_number INTEGER NOT NULL CHECK(seat_number > 0), -- Seat number must be positive
    sold_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Sale time defaults to current time
    FOREIGN KEY (session_id) REFERENCES sessions (session_id) ON DELETE CASCADE,
    CONSTRAINT unique_session_seat UNIQUE(session_id, seat_number) -- Unique combination of session and seat number
);

-- Create table "Refunds" to store refunded tickets

CREATE TABLE refunds (
    refund_id INTEGER PRIMARY KEY AUTOINCREMENT,
    ticket_id INTEGER NOT NULL UNIQUE,
    refund_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    refund_amount REAL NOT NULL CHECK (refund_amount >= 0), -- Refund amount cannot be negative
    FOREIGN KEY (ticket_id) REFERENCES tickets(ticket_id) ON DELETE CASCADE
);

-- Create table "Roles" to store user roles

CREATE TABLE roles (
    role_id INTEGER PRIMARY KEY AUTOINCREMENT,
    role_name TEXT UNIQUE NOT NULL CHECK(length(role_name) > 0), -- Role name cannot be empty
    access_level INTEGER UNIQUE NOT NULL CHECK(access_level > 0), -- Access level must be positive
    CONSTRAINT no_spaces_in_role_name CHECK (role_name NOT LIKE '% %') -- Role name cannot contain spaces
);

-- Create table "Users" to store user details

CREATE TABLE users (
    user_id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL CHECK(length(username) > 0), -- Username cannot be empty
    password_hash TEXT NOT NULL CHECK(length(password_hash) > 0), -- Password hash cannot be empty
    salt TEXT UNIQUE NOT NULL CHECK(length(salt) > 0), -- Salt cannot be empty
    role_id INTEGER NOT NULL,
    FOREIGN KEY (role_id) REFERENCES roles(role_id) ON DELETE CASCADE,
    CONSTRAINT no_spaces_in_username CHECK (username NOT LIKE '% %') -- Username cannot contain spaces
);

