-- Comptes d'acces, tous roles confondus.
--
-- Une seule table pour les quatre roles. Les profils metier (prestataire,
-- client) viendront dans des tables adossees a celle-ci par utilisateur_id :
-- c'est ce qui permet a un role de porter ses attributs propres sans polluer
-- la table d'authentification.

CREATE TABLE utilisateurs (
    id                    BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,

    -- Reference publique (ULID) utilisee dans les URLs. Un identifiant
    -- sequentiel exposerait le volume de comptes et serait enumerable.
    reference             CHAR(26)        NOT NULL,

    email                 VARCHAR(190)    NOT NULL,

    -- NULL tant que le titulaire n'a pas defini son mot de passe : c'est cet
    -- etat qui distingue « en attente d'activation » de « actif ».
    mot_de_passe_hash     VARCHAR(255)    NULL,

    role                  ENUM('superadmin','concierge','prestataire','client') NOT NULL,
    nom                   VARCHAR(120)    NOT NULL,
    telephone             VARCHAR(30)     NULL,

    -- Revocation = actif a 0. On ne supprime jamais : les interventions et le
    -- journal d'audit referenceront ce compte pendant des annees.
    actif                 TINYINT(1)      NOT NULL DEFAULT 1,
    derniere_connexion_le DATETIME        NULL,
    revoque_le            DATETIME        NULL,
    revoque_par           BIGINT UNSIGNED NULL,
    cree_par              BIGINT UNSIGNED NULL,
    cree_le               DATETIME        NOT NULL,
    modifie_le            DATETIME        NOT NULL,

    PRIMARY KEY (id),
    UNIQUE KEY uq_utilisateurs_email (email),
    UNIQUE KEY uq_utilisateurs_reference (reference),

    -- Sert la liste filtree du superadmin.
    KEY idx_utilisateurs_role_actif (role, actif),

    CONSTRAINT fk_utilisateurs_cree_par
        FOREIGN KEY (cree_par) REFERENCES utilisateurs (id) ON DELETE SET NULL,
    CONSTRAINT fk_utilisateurs_revoque_par
        FOREIGN KEY (revoque_par) REFERENCES utilisateurs (id) ON DELETE SET NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
