USE `fedibooks`;
CREATE TABLE IF NOT EXISTS `users` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `email` VARCHAR(128) UNIQUE NOT NULL,
  `password` BINARY(60) NOT NULL,
  `fetch` ENUM('always', 'once', 'never') DEFAULT 'once',
  `submit` ENUM('always', 'once', 'never') DEFAULT 'once',
  `generation` ENUM('always', 'once', 'never') DEFAULT 'once',
  `reply` ENUM('always', 'once', 'never') DEFAULT 'once'
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS `credentials` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `client_id` VARCHAR(128) NOT NULL,
  `client_secret` VARCHAR(128) NOT NULL,
  `secret` VARCHAR(128) NOT NULL
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS `bots` (
  `handle` VARCHAR(128) PRIMARY KEY,
  `user_id` INT NOT NULL,
  `credentials_id` INT NOT NULL,
  `push_private_key` VARCHAR(256) NOT NULL,
  `push_public_key` VARCHAR(256) NOT NULL,
  `push_secret` VARCHAR(256),
  `enabled` BOOLEAN DEFAULT 1,
  `replies_enabled` BOOLEAN DEFAULT 1,
  `post_frequency` SMALLINT UNSIGNED DEFAULT 30,
  `content_warning` VARCHAR(128),
  `length` SMALLINT UNSIGNED DEFAULT 500,
  `fake_mentions` ENUM('always', 'start', 'never') DEFAULT 'start',
  `fake_mentions_full` BOOLEAN DEFAULT 0,
  `post_privacy` ENUM('public', 'unlisted', 'followers_only') DEFAULT 'unlisted',
  `learn_from_cw` BOOLEAN DEFAULT 0,
  `last_post` DATETIME DEFAULT 0,
  `icon` VARCHAR(512),
  `icon_update_time` DATETIME DEFAULT 0,
  FOREIGN KEY (`user_id`) REFERENCES users(id) ON DELETE CASCADE,
  FOREIGN KEY (`credentials_id`) REFERENCES credentials(id) ON DELETE CASCADE
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS `fedi_accounts` (
  `handle` VARCHAR(128) PRIMARY KEY,
  `outbox` VARCHAR(256),
  `credentials_id` INT,
  `icon` VARCHAR(512),
  `icon_update_time` DATETIME DEFAULT 0,
  FOREIGN KEY (`credentials_id`) REFERENCES credentials(id) ON DELETE CASCADE
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS `bot_learned_accounts` (
  `bot_id` VARCHAR(128) NOT NULL,
  `fedi_id` VARCHAR(128) NOT NULL,
  `enabled` BOOLEAN DEFAULT 1,
  FOREIGN KEY (`bot_id`) REFERENCES bots(handle) ON DELETE CASCADE,
  FOREIGN KEY (`fedi_id`) REFERENCES fedi_accounts(handle) ON DELETE CASCADE
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS `posts` (
  `id` BIGINT AUTO_INCREMENT PRIMARY KEY,
  `fedi_id` VARCHAR(128),
  `post_id` VARCHAR(64) NOT NULL,
  `content` TEXT NOT NULL,
  `cw` BOOLEAN NOT NULL,
  FOREIGN KEY (`fedi_id`) REFERENCES fedi_accounts(handle) ON DELETE CASCADE
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS `word_blacklist` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `bot_id` VARCHAR(128) NOT NULL,
  `phrase` VARCHAR(128) NOT NULL,
  `whole_word` BOOLEAN NOT NULL,
  FOREIGN KEY (`bot_id`) REFERENCES bots(handle) ON DELETE CASCADE
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS `contact_history` (
  `user_id` INT NOT NULL,
  `fetch` BOOLEAN DEFAULT 0,
  `submit` BOOLEAN DEFAULT 0,
  `generation` BOOLEAN DEFAULT 0,
  `reply` BOOLEAN DEFAULT 0,
  FOREIGN KEY (`user_id`) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=INNODB;
