CREATE TYPE user_role AS ENUM ('regular', 'admin');

CREATE TABLE IF NOT EXISTS users (
    username VARCHAR(255) NOT NULL PRIMARY KEY,
    "password" text NOT NULL,
    user_role user_role NOT NULL DEFAULT 'regular'
);

CREATE TABLE IF NOT EXISTS user_session (
    id UUID NOT NULL PRIMARY KEY DEFAULT gen_random_uuid(),
    token text NOT NULL,
    "user" varchar(255) NOT NULL,
    FOREIGN KEY("user") REFERENCES users(username)
);

CREATE TABLE IF NOT EXISTS artist (
    id UUID NOT NULL PRIMARY KEY DEFAULT gen_random_uuid(),
    name text NOT NULL
);

CREATE TABLE IF NOT EXISTS album (
    id UUID NOT NULL PRIMARY KEY DEFAULT gen_random_uuid(),
    title text NOT NULL,
    artist UUID,
    FOREIGN KEY(artist) REFERENCES artist(id)
);

CREATE TABLE IF NOT EXISTS track (
    id UUID NOT NULL PRIMARY KEY DEFAULT gen_random_uuid(),
    path text NOT NULL,
    title text,
    date_added timestamptz NOT NULL DEFAULT current_timestamp,
    album UUID,
    artist UUID,
    meta jsonb,
    FOREIGN KEY(album) REFERENCES album(id),
    FOREIGN KEY(artist) REFERENCES artist(id)
);

CREATE TYPE event_kind AS ENUM ('play', 'played', 'stop');

CREATE TABLE IF NOT EXISTS events (
    id UUID NOT NULL DEFAULT gen_random_uuid(),
    time timestamptz NOT NULL DEFAULT current_timestamp,
    kind event_kind NOT NULL,
    "user" VARCHAR(255) NOT NULL,
    track UUID NOT NULL,
    FOREIGN KEY("user") REFERENCES users(username),
    FOREIGN KEY(track) REFERENCES track(id)
);

SELECT create_hypertable('events', by_range('time'));

CREATE TYPE visibility AS ENUM ('public', 'private');

CREATE TABLE IF NOT EXISTS playlist (
    id UUID NOT NULL PRIMARY KEY DEFAULT gen_random_uuid(),
    owner VARCHAR(255) NOT NULL,
    title text NOT NULL,
    visibility visibility NOT NULL DEFAULT 'private',
    tracks UUID[] NOT NULL DEFAULT '{}',
    FOREIGN KEY(owner) REFERENCES users(username)
);
