-- Metadata {{{
CREATE TABLE VersionHistory(
  version INTEGER NOT NULL,
  time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
  author TEXT
);
INSERT INTO VersionHistory (version, author) VALUES (1, 'Initial Creation');


CREATE OR REPLACE FUNCTION update_timestamp_column()
RETURNS TRIGGER AS $$
BEGIN
  NEW._timestamp = (now() at time zone 'utc'); 
  RETURN NEW;
END;
$$ language 'plpgsql';
-- }}}

-- App metadata {{{

CREATE TABLE app_config(
  appname TEXT PRIMARY KEY,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE bot_config(
  appname TEXT PRIMARY KEY REFERENCES app_config(appname) ON DELETE CASCADE,
  sponsor_prompt TEXT,
  sponsor_message TEXT,
  default_skin TEXT
);
-- }}}

-- Channel Linker {{{

CREATE TABLE links(
  linkid SERIAL PRIMARY KEY,
  name TEXT
);

CREATE TABLE channel_webhooks(
  channelid BIGINT PRIMARY KEY,
  webhookid BIGINT NOT NULL,
  token TEXT NOT NULL
);

CREATE TABLE channel_links(
  linkid INTEGER NOT NULL REFERENCES links (linkid) ON DELETE CASCADE,
  channelid BIGINT NOT NULL REFERENCES channel_webhooks (channelid) ON DELETE CASCADE,
  PRIMARY KEY (linkid, channelid)
);


-- }}}

-- Stream Alerts {{{

-- DROP TABLE IF EXISTS stream_alerts;
-- DROP TABLE IF EXISTS streams;
-- DROP TABLE IF EXISTS alert_channels;
-- DROP TABLE IF EXISTS streamers;

CREATE TABLE streamers(
  userid BIGINT PRIMARY KEY,
  login_name TEXT NOT NULL,
  display_name TEXT NOT NULL
);

CREATE TABLE alert_channels(
  subscriptionid SERIAL PRIMARY KEY,
  guildid BIGINT NOT NULL,
  channelid BIGINT NOT NULL,
  streamerid BIGINT NOT NULL REFERENCES streamers (userid) ON DELETE CASCADE,
  created_by BIGINT NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  paused BOOLEAN NOT NULL DEFAULT FALSE,
  end_delete BOOLEAN NOT NULL DEFAULT FALSE,
  live_message TEXT,
  end_message TEXT
);
CREATE INDEX alert_channels_guilds ON alert_channels (guildid);
CREATE UNIQUE INDEX alert_channels_channelid_streamerid ON alert_channels (channelid, streamerid);

CREATE TABLE streams(
  streamid SERIAL PRIMARY KEY,
  streamerid BIGINT NOT NULL REFERENCES streamers (userid) ON DELETE CASCADE,
  start_at TIMESTAMPTZ NOT NULL,
  twitch_stream_id BIGINT,
  game_name TEXT,
  title TEXT,
  end_at TIMESTAMPTZ
);

CREATE TABLE stream_alerts(
    alertid SERIAL PRIMARY KEY,
    streamid INTEGER NOT NULL REFERENCES streams (streamid) ON DELETE CASCADE,
    subscriptionid INTEGER NOT NULL REFERENCES alert_channels (subscriptionid) ON DELETE CASCADE,
    sent_at TIMESTAMPTZ NOT NULL,
    messageid BIGINT NOT NULL,
    resolved_at TIMESTAMPTZ
);


-- }}}

-- vim: set fdm=marker:
