-- v1: Initial revision

CREATE TABLE portal (
    channel_id TEXT,
    receiver   TEXT,
    mxid       TEXT UNIQUE,

    name  TEXT NOT NULL,
    topic TEXT NOT NULL,

    avatar     TEXT NOT NULL,
    avatar_url TEXT,

    encrypted BOOLEAN NOT NULL DEFAULT false,

    type INT,
    dmuser TEXT,

    first_event_id TEXT,

    PRIMARY KEY (channel_id, receiver)
);

CREATE TABLE puppet (
    id           TEXT PRIMARY KEY,
    display_name TEXT,

    avatar     TEXT,
    avatar_url TEXT,

    enable_presence BOOLEAN NOT NULL DEFAULT true,
    enable_receipts BOOLEAN NOT NULL DEFAULT true,

    custom_mxid  TEXT,
    access_token TEXT,
    next_batch   TEXT
);

CREATE TABLE "user" (
    mxid TEXT PRIMARY KEY,
    id   TEXT UNIQUE,

    management_room TEXT,

    token TEXT
);

CREATE TABLE message (
    channel_id TEXT NOT NULL,
    receiver   TEXT NOT NULL,

    discord_message_id TEXT NOT NULL,
    matrix_message_id  TEXT NOT NULL UNIQUE,

    author_id TEXT   NOT NULL,
    timestamp BIGINT NOT NULL,

    PRIMARY KEY(discord_message_id, channel_id, receiver),
    FOREIGN KEY(channel_id, receiver) REFERENCES portal(channel_id, receiver) ON DELETE CASCADE
);

CREATE TABLE reaction (
    channel_id TEXT NOT NULL,
    receiver   TEXT NOT NULL,

    discord_message_id TEXT NOT NULL,
    matrix_event_id    TEXT NOT NULL UNIQUE,

    author_id TEXT NOT NULL,

    matrix_name TEXT,
    matrix_url TEXT,

    discord_id TEXT,

    UNIQUE (discord_id, author_id, discord_message_id, channel_id, receiver),
    FOREIGN KEY(channel_id, receiver) REFERENCES portal(channel_id, receiver) ON DELETE CASCADE
);

CREATE TABLE attachment (
    channel_id TEXT NOT NULL,
    receiver   TEXT NOT NULL,

    discord_message_id    TEXT NOT NULL,
    discord_attachment_id TEXT NOT NULL,

    matrix_event_id TEXT NOT NULL UNIQUE,

    PRIMARY KEY(discord_attachment_id, matrix_event_id),
    FOREIGN KEY(channel_id, receiver) REFERENCES portal(channel_id, receiver) ON DELETE CASCADE
);

CREATE TABLE emoji (
    discord_id   TEXT PRIMARY KEY,
    discord_name TEXT,
    matrix_url   TEXT
);

CREATE TABLE guild (
    discord_id TEXT NOT NULL,
    guild_id   TEXT NOT NULL,
    guild_name TEXT NOT NULL,
    bridge     BOOLEAN DEFAULT FALSE,
    PRIMARY KEY(discord_id, guild_id)
);
