DROP TABLE IF EXISTS order_details CASCADE;
DROP TABLE IF EXISTS orders CASCADE;
DROP TABLE IF EXISTS menu_items CASCADE;
DROP TABLE IF EXISTS users CASCADE;

-- =======================================================
-- USER TABLE
-- =======================================================

CREATE TABLE users (
    id BIGSERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    email VARCHAR(100) UNIQUE
);

-- =======================================================
-- MENU ITEM TABLE
-- =======================================================

CREATE TABLE menu_items (
    id BIGSERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    description TEXT,
    price NUMERIC(10,2) NOT NULL CHECK (price > 0),
    category VARCHAR(50)
);

-- =======================================================
-- ORDERS TABLE
-- =======================================================

CREATE TABLE orders (
    id BIGSERIAL PRIMARY KEY,
    user_id BIGINT NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    total_price NUMERIC(10,2) NOT NULL CHECK (total_price >= 0),

    CONSTRAINT fk_orders_user
        FOREIGN KEY (user_id)
        REFERENCES users(id)
        ON DELETE CASCADE
);

-- =======================================================
-- ORDER DETAILS TABLE
-- =======================================================

CREATE TABLE order_details (
    id BIGSERIAL PRIMARY KEY,
    order_id BIGINT NOT NULL,
    menu_item_id BIGINT NOT NULL,
    quantity INTEGER NOT NULL CHECK (quantity > 0),
    item_price NUMERIC(10,2) NOT NULL CHECK (item_price > 0),

    CONSTRAINT fk_order_details_order
        FOREIGN KEY (order_id)
        REFERENCES orders(id)
        ON DELETE CASCADE,

    CONSTRAINT fk_order_details_menu_item
        FOREIGN KEY (menu_item_id)
        REFERENCES menu_items(id)
);

-- =======================================================
-- INITIAL MENU DATA
-- =======================================================

INSERT INTO menu_items (name, description, price, category)
VALUES
('Pepperoni Pizza', 'Classic pepperoni pizza', 10.99, 'Pizza'),
('Cheese Burger', 'Beef burger with cheese', 8.50, 'Burger'),
('Chicken Pasta', 'Creamy chicken pasta', 12.75, 'Pasta'),
('Coca Cola', 'Soft drink', 2.50, 'Drink');

-- =======================================================
-- OPTIONAL TEST DATA
-- =======================================================

INSERT INTO users (username, password_hash, email)
VALUES
('ali', 'hashed_password_1', 'ali@example.com'),
('sara', 'hashed_password_2', 'sara@example.com');

INSERT INTO orders (user_id, total_price)
VALUES
(1, 24.48);

INSERT INTO order_details (order_id, menu_item_id, quantity, item_price)
VALUES
(1, 1, 2, 10.99),
(1, 4, 1, 2.50);