CREATE TABLE `users` (
	`user_id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
	`username` VARCHAR(20) NOT NULL,
	`password_hash` CHAR(73) NOT NULL,
	`signup_date` INT UNSIGNED NOT NULL,
	PRIMARY KEY (`user_id`)
) ENGINE=InnoDB CHARSET utf8mb4;

CREATE TABLE `chat_messages` (
	`message_id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
	`room_id` MEDIUMINT UNSIGNED NOT NULL,
	`name_id` SMALLINT UNSIGNED DEFAULT NULL,
	`date` INT UNSIGNED NOT NULL,
	`message` TEXT NOT NULL,
	PRIMARY KEY (`message_id`)
) ENGINE=InnoDB CHARSET utf8mb4;

CREATE TABLE `quest_meta` (
	`quest_id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
	`canon_title` VARCHAR(300) DEFAULT NULL,
	`ident_title` VARCHAR(300) DEFAULT NULL,
	`owner_id` SMALLINT UNSIGNED DEFAULT NULL,
	`open_post_id` SMALLINT UNSIGNED DEFAULT NULL,
	PRIMARY KEY (`quest_id`),
	FOREIGN KEY (`owner_id`) REFERENCES `users`(`user_id`)
) ENGINE=InnoDB CHARSET utf8mb4;

CREATE TABLE `quest_data` (
	`post_id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
	`quest_id` SMALLINT UNSIGNED NOT NULL,
	`post_type` ENUM('text', 'dice', 'poll') NOT NULL,
	`post` MEDIUMTEXT NOT NULL,
	`timestamp` INT UNSIGNED NOT NULL,
	PRIMARY KEY (`post_id`),
	FOREIGN KEY (`quest_id`) REFERENCES `quest_meta`(`quest_id`)
) ENGINE=InnoDB CHARSET utf8mb4;

CREATE TABLE `dice_calls` (
	`post_id` MEDIUMINT UNSIGNED NOT NULL,
	`dice_roll` TEXT NOT NULL,
	`strict` BOOLEAN DEFAULT FALSE,
	`dice_challenge` SMALLINT UNSIGNED,
	`rolls_taken` TINYINT UNSIGNED,
	FOREIGN KEY (`post_id`) REFERENCES `quest_data`(`post_id`)
) ENGINE=InnoDB CHARSET utf8mb4;

CREATE TABLE `dice_rolls` (
	`message_id` MEDIUMINT UNSIGNED NOT NULL,
	`quest_id` SMALLINT UNSIGNED NOT NULL,
	`post_id` MEDIUMINT UNSIGNED NOT NULL,
	`roll_dice` TEXT NOT NULL,
	`roll_results` TEXT NOT NULL,
	`roll_total` SMALLINT UNSIGNED NOT NULL,
	FOREIGN KEY (`message_id`) REFERENCES `chat_messages`(`message_id`),
	FOREIGN KEY (`post_id`) REFERENCES `dice_calls`(`post_id`)
) ENGINE=InnoDB CHARSET utf8mb4;

CREATE TABLE `polls` (
	`post_id` MEDIUMINT UNSIGNED NOT NULL,
	`quest_id` SMALLINT UNSIGNED NOT NULL,
	`multi_choice` BOOLEAN DEFAULT FALSE,
	`allow_writein` BOOLEAN DEFAULT FALSE,
	FOREIGN KEY (`post_id`) REFERENCES `quest_data`(`post_id`),
	FOREIGN KEY (`quest_id`) REFERENCES `quest_meta`(`quest_id`)
) ENGINE=InnoDB CHARSET utf8mb4;

CREATE TABLE `poll_options` (
	`option_id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
	`post_id` MEDIUMINT UNSIGNED NOT NULL,
	`option_text` VARCHAR(200) NOT NULL,
	PRIMARY KEY (`option_id`),
	FOREIGN KEY (`post_id`) REFERENCES `polls`(`post_id`)
) ENGINE=InnoDB CHARSET utf8mb4;

CREATE TABLE `poll_votes` (
	`option_id` MEDIUMINT UNSIGNED NOT NULL,
	`ip_address` VARCHAR(32) NOT NULL,
	FOREIGN KEY (`option_id`) REFERENCES `poll_options`(`option_id`),
	UNIQUE (`option_id`, `ip_address`)
) ENGINE=InnoDB CHARSET utf8mb4;
