-- =====================================================================
-- Arche du Pain - Script de creation de la base de donnees
-- Encodage : UTF-8 (utf8mb4)
-- Moteur   : InnoDB (cles etrangeres + transactions)
-- =====================================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- =====================================================================
-- TABLE : acp_users
-- Gestion des utilisateurs (admin et clients)
-- =====================================================================
DROP TABLE IF EXISTS acp_users;
CREATE TABLE acp_users (
    id_user                 INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    nom                     VARCHAR(50)     NOT NULL,
    email                   VARCHAR(50)     NOT NULL,
    password                VARCHAR(255)    NOT NULL COMMENT 'Hash bcrypt/argon2',
    role                    ENUM('admin','client') NOT NULL DEFAULT 'client',
    date_inscription        DATE            NOT NULL,
    date_connexion          DATETIME        NULL,
    must_change_password    TINYINT(1)      NOT NULL DEFAULT 1,
    token_reset             VARCHAR(64)     NULL,
    token_reset_expires     DATETIME        NULL,
    PRIMARY KEY (id_user),
    UNIQUE KEY uk_users_email (email),
    KEY idx_users_role (role)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =====================================================================
-- TABLE : acp_categories
-- Categories de produits
-- =====================================================================
DROP TABLE IF EXISTS acp_categories;
CREATE TABLE acp_categories (
    id_categ        INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    label_categ     VARCHAR(50)     NOT NULL,
    PRIMARY KEY (id_categ),
    UNIQUE KEY uk_categ_label (label_categ)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO acp_categories (id_categ, label_categ) VALUES
    (1, 'Viennoiseries'),
    (2, 'Pains'),
    (3, 'Pâtisseries'),
    (4, 'Pains spéciaux'),
    (5, 'Autres');

-- =====================================================================
-- TABLE : acp_produit
-- Catalogue des produits
-- =====================================================================
DROP TABLE IF EXISTS acp_produit;
CREATE TABLE acp_produit (
    id_prod         INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    id_categ        INT(4) UNSIGNED NOT NULL,
    label_prod      VARCHAR(50)     NOT NULL,
    prix            DECIMAL(6,2)    NOT NULL,
    statut          TINYINT(1)      NOT NULL DEFAULT 1 COMMENT '1=disponible, 0=non disponible',
    PRIMARY KEY (id_prod),
    KEY idx_prod_categ (id_categ),
    KEY idx_prod_statut (statut),
    CONSTRAINT fk_prod_categ FOREIGN KEY (id_categ)
        REFERENCES acp_categories (id_categ)
        ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO acp_produit (id_prod, id_categ, label_prod, prix, statut) VALUES
    (1, 2, 'Le Soleil',       4.50, 1),
    (2, 2, 'Le Céréale',      5.00, 1),
    (3, 2, 'Le Meunier',      5.00, 1),
    (4, 2, 'Le Signature',    4.50, 1),
    (5, 2, 'L''Épeautre',     5.50, 1),
    (6, 2, 'Pavé Chocolat',   1.50, 1),
    (7, 2, 'Pavé Olive',      1.50, 1),
    (8, 2, 'Baguette',        2.50, 1);

-- =====================================================================
-- TABLE : acp_commandes
-- Commandes validees (= ex-paniers, panier client gere en localStorage)
-- =====================================================================
DROP TABLE IF EXISTS acp_commandes;
CREATE TABLE acp_commandes (
    id_commande                 INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    id_user                     INT(4) UNSIGNED NOT NULL,
    date_commande               DATETIME        NOT NULL,
    date_livraison_prevue       DATE            NULL,
    date_livraison_effective    DATE            NULL,
    montant_total               DECIMAL(8,2)    NOT NULL DEFAULT 0.00,
    statut                      ENUM('en_cours','validee','livree','annulee') NOT NULL DEFAULT 'validee',
    mail_envoye                 TINYINT(1)      NOT NULL DEFAULT 0,
    PRIMARY KEY (id_commande),
    KEY idx_cmd_user (id_user),
    KEY idx_cmd_date (date_commande),
    KEY idx_cmd_statut (statut),
    KEY idx_cmd_livraison (date_livraison_prevue),
    CONSTRAINT fk_cmd_user FOREIGN KEY (id_user)
        REFERENCES acp_users (id_user)
        ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =====================================================================
-- TABLE : acp_detail_commandes
-- Lignes de commande avec snapshot prix/label (relation 1-N)
-- =====================================================================
DROP TABLE IF EXISTS acp_detail_commandes;
CREATE TABLE acp_detail_commandes (
    id_detail           INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    id_commande         INT(4) UNSIGNED NOT NULL,
    id_prod             INT(4) UNSIGNED NOT NULL,
    label_prod_snap     VARCHAR(50)     NOT NULL COMMENT 'Snapshot du nom au moment de la commande',
    prix_unitaire       DECIMAL(6,2)    NOT NULL COMMENT 'Snapshot du prix au moment de la commande',
    nb_pieces           INT             NOT NULL,
    sous_total          DECIMAL(8,2)    NOT NULL,
    PRIMARY KEY (id_detail),
    KEY idx_det_commande (id_commande),
    KEY idx_det_prod (id_prod),
    CONSTRAINT fk_det_cmd FOREIGN KEY (id_commande)
        REFERENCES acp_commandes (id_commande)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT fk_det_prod FOREIGN KEY (id_prod)
        REFERENCES acp_produit (id_prod)
        ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =====================================================================
-- TABLE : acp_parametres
-- Parametrage applicatif pilotable depuis le BO
-- =====================================================================
DROP TABLE IF EXISTS acp_parametres;
CREATE TABLE acp_parametres (
    id_param        INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    cle             VARCHAR(50)     NOT NULL,
    valeur          VARCHAR(255)    NULL,
    type_valeur     ENUM('bool','int','string','time') NOT NULL DEFAULT 'string',
    description     VARCHAR(255)    NULL,
    date_modif      DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id_param),
    UNIQUE KEY uk_param_cle (cle)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO acp_parametres (cle, valeur, type_valeur, description) VALUES
    ('client_peut_modifier_commande', '0',          'bool',   'Le client peut modifier sa commande apres validation'),
    ('client_peut_annuler_commande',  '0',          'bool',   'Le client peut annuler sa commande apres validation'),
    ('delai_limite_commande',         '18:00:00',   'time',   'Heure limite de commande pour livraison J+n'),
    ('delai_jours_avant_livraison',   '1',          'int',    'Nombre de jours entre commande et livraison'),
    ('mail_expedition',               '',           'string', 'Adresse mail destinataire commandes (override config.js)'),
    ('mail_backup',                   '',           'string', 'Adresse mail de backup commandes (override config.js)');

-- =====================================================================
-- TABLE : acp_traductions
-- Textes des dialogues, multilingue (FR par defaut)
-- =====================================================================
DROP TABLE IF EXISTS acp_traductions;
CREATE TABLE acp_traductions (
    id_trad         INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
    cle_trad        VARCHAR(100)    NOT NULL,
    langue          CHAR(2)         NOT NULL DEFAULT 'FR',
    valeur          TEXT            NOT NULL,
    contexte        VARCHAR(50)     NULL,
    date_modif      DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id_trad),
    UNIQUE KEY uk_trad_cle_langue (cle_trad, langue),
    KEY idx_trad_contexte (contexte)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO acp_traductions (cle_trad, langue, valeur, contexte) VALUES
    -- Login
    ('login.titre',                     'FR', 'Connexion',                                            'login'),
    ('login.label_email',               'FR', 'Adresse email',                                        'login'),
    ('login.label_password',            'FR', 'Mot de passe',                                         'login'),
    ('login.btn_connexion',             'FR', 'Se connecter',                                         'login'),
    ('login.btn_creer_compte',          'FR', 'Créer un compte',                                      'login'),
    ('login.lien_mot_passe_oublie',     'FR', 'Mot de passe oublié ?',                                'login'),
    ('login.erreur_identifiants',       'FR', 'Email ou mot de passe incorrect',                      'login'),
    ('login.compte_cree',               'FR', 'Compte créé. Votre mot de passe vous a été envoyé par email.', 'login'),
    ('login.email_existe',              'FR', 'Cette adresse email est déjà utilisée',                'login'),
    ('login.changer_mdp_titre',         'FR', 'Changement de mot de passe obligatoire',               'login'),
    ('login.mdp_oublie_envoye',         'FR', 'Un email de réinitialisation vous a été envoyé',       'login'),

    -- Catalogue
    ('catalogue.titre',                 'FR', 'Nos produits',                                         'catalogue'),
    ('catalogue.aucune_categorie',      'FR', 'Aucun produit disponible pour le moment',              'catalogue'),
    ('catalogue.produit_indisponible',  'FR', 'Indisponible',                                         'catalogue'),
    ('catalogue.label_quantite',        'FR', 'Quantité',                                             'catalogue'),
    ('catalogue.prix_unitaire',         'FR', 'Prix unitaire',                                        'catalogue'),

    -- Panier
    ('panier.titre',                    'FR', 'Mon panier',                                           'panier'),
    ('panier.vide',                     'FR', 'Votre panier est vide',                                'panier'),
    ('panier.total',                    'FR', 'Total',                                                'panier'),
    ('panier.btn_valider',              'FR', 'Valider la commande',                                  'panier'),
    ('panier.btn_annuler',              'FR', 'Annuler',                                              'panier'),
    ('panier.confirmation_titre',       'FR', 'Récapitulatif de votre commande',                      'panier'),
    ('panier.confirmation_message',     'FR', 'Confirmez-vous cette commande ?',                      'panier'),
    ('panier.btn_confirmer',            'FR', 'Confirmer',                                            'panier'),
    ('panier.btn_retour',               'FR', 'Retour',                                               'panier'),
    ('panier.commande_envoyee',         'FR', 'Votre commande a bien été envoyée',                    'panier'),
    ('panier.livraison_prevue',         'FR', 'Livraison prévue le',                                  'panier'),

    -- Mail
    ('mail.objet_commande',             'FR', 'Nouvelle commande Arche du Pain',                      'mail'),
    ('mail.objet_creation_compte',      'FR', 'Bienvenue sur Arche du Pain - Vos identifiants',       'mail'),
    ('mail.objet_reset_mdp',            'FR', 'Arche du Pain - Réinitialisation de votre mot de passe', 'mail'),
    ('mail.entete_commande',            'FR', 'Commande n°',                                          'mail'),
    ('mail.client',                     'FR', 'Client',                                               'mail'),
    ('mail.date_commande',              'FR', 'Date de commande',                                     'mail'),
    ('mail.date_livraison',             'FR', 'Date de livraison',                                    'mail'),

    -- Erreurs generiques
    ('erreur.serveur',                  'FR', 'Une erreur est survenue. Veuillez réessayer.',         'erreur'),
    ('erreur.session_expiree',          'FR', 'Votre session a expiré. Veuillez vous reconnecter.',   'erreur'),
    ('erreur.commande_vide',            'FR', 'Votre commande ne contient aucun produit',             'erreur'),
    ('erreur.delai_depasse',            'FR', 'Délai de commande dépassé pour aujourd''hui',          'erreur'),

    -- Compte
    ('compte.titre',                    'FR', 'Mon compte',                                           'compte'),
    ('compte.deconnexion',              'FR', 'Se déconnecter',                                       'compte'),
    ('compte.changer_mdp',              'FR', 'Changer mon mot de passe',                             'compte');

SET FOREIGN_KEY_CHECKS = 1;
