-- Suppression des tables
DROP TABLE IF EXISTS Commentary;
DROP TABLE IF EXISTS Favorite;
DROP TABLE IF EXISTS Quote;
DROP TABLE IF EXISTS Caracter;
DROP TABLE IF EXISTS Source;
DROP TABLE IF EXISTS Record_quiz;
DROP TABLE IF EXISTS Quiz_Question;
DROP TABLE IF EXISTS Quiz;
DROP TABLE IF EXISTS Question;
DROP TABLE IF EXISTS Admin;
DROP TABLE IF EXISTS Users;
DROP TABLE IF EXISTS Image;

-- Création des tables

CREATE TABLE Image(
    id_img  NUMERIC PRIMARY KEY,
    imgPath  varchar(100) NOT NULL UNIQUE
);

CREATE TABLE Users(
    id_user     SERIAL     PRIMARY KEY,
    username    varchar(50) NOT NULL,
    email       varchar(50) NOT NULL,
    password     varchar(100) NOT NULL,
    img         NUMERIC         NOT NULL,
    creation    date        NOT NULL,
    CONSTRAINT  unique_col  UNIQUE (email),
    CONSTRAINT fk_img FOREIGN KEY(img) REFERENCES Image(id_img)
);

CREATE TABLE Admin(
    users    SERIAL PRIMARY KEY,
    CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user)
);

CREATE TABLE Question(
    id_question SERIAL PRIMARY KEY,
    texte text  NOT NULL UNIQUE, 
    answerA varchar(30) NOT NULL,
    answerB varchar(30) NOT NULL,
    answerC varchar(30) NOT NULL,
    answerD varchar(30) NOT NULL,
    cAnswer  varchar(30) NOT NULL,
    CONSTRAINT check_cAnswer CHECK (cAnswer = answerA OR cAnswer = answerB OR cAnswer = answerC OR cAnswer = answerD)
);

CREATE TABLE Quiz(
    id_quiz    SERIAL  PRIMARY KEY,
    levelQ   numeric     NOT NULL,
    timer   numeric     NOT NULL
);

CREATE TABLE Quiz_Question(
    quiz    SERIAL NOT NULL,
    question    SERIAL NOT NULL,
    PRIMARY KEY (quiz, question),
    CONSTRAINT fk_quiz FOREIGN KEY(quiz) REFERENCES Quiz(id_quiz),
    CONSTRAINT fk_question FOREIGN KEY(question) REFERENCES Question(id_question)
);

CREATE TABLE Record_quiz(
    users    SERIAL NOT NULL,
    quiz    SERIAL NOT NULL,
    nbPoint numeric DEFAULT '0',
    timeQ    numeric DEFAULT '0',
    PRIMARY KEY (users, quiz),
    CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user),
    CONSTRAINT fk_quiz FOREIGN KEY(quiz) REFERENCES Quiz(id_quiz),
    CONSTRAINT err_nbPoint  CHECK(nbPoint >= 0),
    CONSTRAINT err_timeQ  CHECK(timeQ >= 0)
);

CREATE TABLE Source(
    id_source   SERIAL  PRIMARY KEY,
    title   varchar(100) NOT NULL,
    dateS   numeric(4)    NOT NULL
);

CREATE TABLE Caracter(
    id_caracter     SERIAL  PRIMARY KEY,
    caracter    varchar(100)    NOT NULL,
    id_img    NUMERIC    NOT NULL
);

CREATE TABLE Quote(
    id_quote    SERIAL  PRIMARY KEY,
    content     text    NOT NULL,
    likes       numeric DEFAULT '0',
    langue      char(2) NOT NULL,
    isValide    boolean NOT NULL DEFAULT 'false',
    reason      varchar(100)    NOT NULL,
    id_caracter SERIAL NOT NULL,
    id_source   SERIAL NOT NULL,
    id_user_verif   SERIAL NOT NULL,
    isCitationDuJour boolean NOT NULL DEFAULT 'false',
    CONSTRAINT fk_caracter  FOREIGN KEY(id_caracter) REFERENCES Caracter(id_caracter),
    CONSTRAINT fk_source  FOREIGN KEY(id_source) REFERENCES Source(id_source),
    CONSTRAINT fk_userverif  FOREIGN KEY(id_user_verif) REFERENCES Users(id_user),
    CONSTRAINT err_nbLike CHECK (likes >= 0),
    CONSTRAINT err_language CHECK (langue = 'fr' OR langue = 'en')
);

CREATE TABLE Favorite(
    users    SERIAL NOT NULL,
    quote   SERIAL  NOT NULL,
    PRIMARY KEY (users, quote),
    CONSTRAINT fk_quote  FOREIGN KEY(quote) REFERENCES Quote(id_quote),
    CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user)
);

CREATE TABLE Commentary(
    id_comment  SERIAL PRIMARY KEY,
    quote   SERIAL  NOT NULL,
    users    SERIAL NOT NULL,
    dateC   date    NOT NULL,
    comment text    NOT NULL,
    CONSTRAINT fk_quote  FOREIGN KEY(quote) REFERENCES Quote(id_quote),
    CONSTRAINT fk_user  FOREIGN KEY(users) REFERENCES Users(id_user)
);

