-- Drop tables if they exist
DROP TABLE IF EXISTS note;
DROP TABLE IF EXISTS rendu_devoir;
DROP TABLE IF EXISTS devoir;
DROP TABLE IF EXISTS contenu_cours;
DROP TABLE IF EXISTS inscription;
DROP TABLE IF EXISTS enseignement;
DROP TABLE IF EXISTS cours;
DROP TABLE IF EXISTS utilisateur_role;
DROP TABLE IF EXISTS role;
DROP TABLE IF EXISTS utilisateur;

-- Table utilisateur : représente un utilisateur de l'application
CREATE TABLE utilisateur
(
    id           BIGSERIAL    NOT NULL,
    login        VARCHAR(8)   NOT NULL,
    mot_de_passe VARCHAR(255) NOT NULL,
    nom          VARCHAR(100),
    prenom       VARCHAR(100),
    email        VARCHAR(255),
    token_reinitialisation VARCHAR(255),
    PRIMARY KEY (id),
    CONSTRAINT ux_u_login UNIQUE (login),
    CONSTRAINT ux_u_email UNIQUE (email)
);
CREATE INDEX ix_u_login ON utilisateur (login);

-- Table role : représente un rôle d'utilisateur
CREATE TABLE role
(
    id  BIGSERIAL    NOT NULL,
    nom VARCHAR(100) NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT ux_r_nom UNIQUE (nom)
);
CREATE INDEX ix_r_nom ON role (nom);

-- Table utilisateur_role : association entre utilisateurs et rôles
CREATE TABLE utilisateur_role
(
    utilisateur_id BIGINT NOT NULL,
    role_id        BIGINT NOT NULL,
    PRIMARY KEY (utilisateur_id, role_id),
    CONSTRAINT fk_ur_utilisateur_id FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE,
    CONSTRAINT fk_ur_role_id FOREIGN KEY (role_id) REFERENCES role (id) ON DELETE CASCADE
);
CREATE INDEX ix_ur_utilisateur_id ON utilisateur_role (utilisateur_id);
CREATE INDEX ix_ur_role_id ON utilisateur_role (role_id);

-- Table cours : représente un cours
CREATE TABLE cours
(
    id         BIGSERIAL    NOT NULL,
    nom        VARCHAR(100) NOT NULL,
    date_debut DATE         NOT NULL,
    PRIMARY KEY (id)
);
CREATE INDEX ix_c_nom ON cours (nom);

-- Table enseignement : association entre utilisateurs et cours
CREATE TABLE enseignement
(
    utilisateur_id BIGINT NOT NULL,
    cours_id       BIGINT NOT NULL,
    PRIMARY KEY (utilisateur_id, cours_id),
    CONSTRAINT fk_e_utilisateur_id FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE,
    CONSTRAINT fk_e_cours_id FOREIGN KEY (cours_id) REFERENCES cours (id) ON DELETE CASCADE
);
CREATE INDEX ix_e_utilisateur_id ON enseignement (utilisateur_id);
CREATE INDEX ix_e_cours_id ON enseignement (cours_id);

-- Table inscription : association entre utilisateurs et cours
CREATE TABLE inscription
(
    utilisateur_id   BIGINT    NOT NULL,
    cours_id         BIGINT    NOT NULL,
    date_inscription TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (utilisateur_id, cours_id),
    CONSTRAINT fk_i_utilisateur_id FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE,
    CONSTRAINT fk_i_cours_id FOREIGN KEY (cours_id) REFERENCES cours (id) ON DELETE CASCADE
);
CREATE INDEX ix_i_utilisateur_id ON inscription (utilisateur_id);
CREATE INDEX ix_i_cours_id ON inscription (cours_id);

-- Table contenu_cours : représente le contenu d'un cours
CREATE TABLE contenu_cours
(
    id          BIGSERIAL    NOT NULL,
    cours_id    BIGINT       NOT NULL,
    titre       VARCHAR(255) NOT NULL,
    description TEXT,
    PRIMARY KEY (id),
    CONSTRAINT fk_cc_cours_id FOREIGN KEY (cours_id) REFERENCES cours (id) ON DELETE CASCADE
);
CREATE INDEX ix_cc_cours_id ON contenu_cours (cours_id);

-- Table devoir : représente un devoir associé à un cours
CREATE TABLE devoir
(
    id          BIGSERIAL    NOT NULL,
    cours_id    BIGINT       NOT NULL,
    titre       VARCHAR(255) NOT NULL,
    description TEXT,
    date_debut  TIMESTAMP    NOT NULL,
    date_fin    TIMESTAMP    NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT fk_d_cours_id FOREIGN KEY (cours_id) REFERENCES cours (id) ON DELETE CASCADE
);
CREATE INDEX ix_d_cours_id ON devoir (cours_id);

-- Table rendu_devoir : représente le rendu d'un devoir par un utilisateur
CREATE TABLE rendu_devoir
(
    id             BIGSERIAL NOT NULL,
    devoir_id      BIGINT    NOT NULL,
    utilisateur_id BIGINT    NOT NULL,
    date_rendu     TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    contenu        TEXT,
    PRIMARY KEY (id),
    CONSTRAINT fk_rd_devoir_id FOREIGN KEY (devoir_id) REFERENCES devoir (id) ON DELETE CASCADE,
    CONSTRAINT fk_rd_utilisateur_id FOREIGN KEY (utilisateur_id) REFERENCES utilisateur (id) ON DELETE CASCADE
);
CREATE INDEX ix_rd_devoir_id ON rendu_devoir (devoir_id);
CREATE INDEX ix_rd_utilisateur_id ON rendu_devoir (utilisateur_id);

-- Table note : représente une note attribuée à un rendu de devoir
CREATE TABLE note
(
    id               BIGSERIAL     NOT NULL,
    rendu_devoir_id  BIGINT        NOT NULL,
    valeur           DECIMAL(5, 2) NOT NULL CHECK (valeur >= 0 AND valeur <= 20),
    date_attribution TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    CONSTRAINT fk_n_rendu_devoir_id FOREIGN KEY (rendu_devoir_id) REFERENCES rendu_devoir (id) ON DELETE CASCADE
);
CREATE INDEX ix_n_rendu_devoir_id ON note (rendu_devoir_id);
