CREATE TABLE staff (
    staff_id INTEGER NOT NULL AUTO_INCREMENT,
    email VARCHAR(254) NOT NULL,
    password CHAR(32) NOT NULL,
    token CHAR(8),
    salt CHAR(4) NOT NULL,
    PRIMARY KEY(staff_id),
    CONSTRAINT UQ_Staff_UserName UNIQUE (email)
);

CREATE TABLE location(
    hunt_id INTEGER NOT NULL,
    location_order INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    clue VARCHAR(120) NOT NULL,
    latitude DECIMAL(9, 6) NOT NULL,
    longitude DECIMAL(9, 6) NOT NULL,
    PRIMARY KEY(hunt_id, location_order),
    CONSTRAINT Location_Hunt_HuntID FOREIGN KEY (hunt_id) REFERENCES hunt(hunt_id) ON DELETE CASCADE ON UPDATE CASCADE,
);

CREATE TABLE location_template(
    location_id INTEGER NOT NULL AUTO_INCREMENT,
    creator_id INTEGER NOT NULL,
    name VARCHAR(20) NOT NULL,
    clue VARCHAR(120) NOT NULL,
    latitude DECIMAL(9, 6) NOT NULL,
    longitude DECIMAL(9, 6) NOT NULL,
    PRIMARY KEY(location_id),
    CONSTRAINT FK_LocationTemplate_Staff_CreatorID FOREIGN KEY (creator_id) REFERENCES staff(staff_id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE hunt(
    hunt_id INTEGER NOT NULL AUTO_INCREMENT,
    creator_id INTEGER NOT NULL,
    hunt_name VARCHAR(20) NOT NULL,
    start_time INTEGER NOT NULL DEFAULT 0,
    duration INTEGER NOT NULL,
    difficulty INTEGER NOT NULL DEFAULT 0,
    PRIMARY KEY(hunt_id),
    CONSTRAINT FK_Hunt_Staff_CreatorID FOREIGN KEY (creator_id) REFERENCES staff(staff_id) ON DELETE CASCADE ON UPDATE CASCADE,
);

CREATE TABLE team (
    team_id INTEGER NOT NULL AUTO_INCREMENT,
    hunt_id INTEGER NOT NULL,
    team_pwd VARCHAR(20) NOT NULL,
	team_name VARCHAR(15),
	email VARCHAR(254),
	last_email INTEGER NOT NULL default 0,
    loc_offset INTEGER NOT NULL default 0,
    total_dist INTEGER NOT NULL default 0,
    PRIMARY KEY(team_id),
    CONSTRAINT FK_Team_Hunt_HuntID FOREIGN KEY (hunt_id) REFERENCES hunt(hunt_id) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT UQ_Team_TeamPWD UNIQUE(team_pwd),
    CONSTRAINT UQ_Team_HuntID_TeamName UNIQUE(hunt_id, team_name)
);

CREATE TABLE game_record (
    team_id INTEGER NOT NULL,
    time_first_get_loc INTEGER NOT NULL default 0,
    clues_found INTEGER NOT NULL default 0,
    reveal_time INTEGER NOT NULL default 0,
	rank INTEGER NOT NULL default 0,
    question INTEGER NOT NULL default 0, 
    PRIMARY KEY(team_id),
    CONSTRAINT FK_GameRecord_Team_TeamID FOREIGN KEY (team_id) REFERENCES team(team_id) ON DELETE CASCADE ON UPDATE CASCADE
);


CREATE TABLE quiz_question (
    question_id INTEGER NOT NULL AUTO_INCREMENT,
    hunt_id INTEGER NOT NULL,
    question VARCHAR(100) NOT NULL,
    right_ans INTEGER NOT NULL DEFAULT -1,
    PRIMARY KEY(question_id),
    CONSTRAINT FK_QuizQuestion_Hunt_HuntID FOREIGN KEY (hunt_id) REFERENCES hunt(hunt_id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE quiz_option (
    question_id INTEGER NOT NULL AUTO_INCREMENT,
    quiz_order INTEGER NOT NULL,
    quiz_option VARCHAR(30) NOT NULL,
    PRIMARY_KEY(question_id, order),
    CONSTRAINT FK_QuizAnswer_QuizQuestion_QuizID FOREIGN KEY(quiz_id) REFERENCES quiz_question(quiz_id) ON DELETE CASCADE ON UPDATE CASCADE
);
