SET
  SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

START TRANSACTION;

SET
  time_zone = "+00:00";

--
-- Base de données : `sgr_mono`
--
CREATE DATABASE IF NOT EXISTS `sgr_mono` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

USE `sgr_mono`;

CREATE TABLE `categorie_plat` (
  `id_cat` int(11) NOT NULL,
  `nom_cat` varchar(30) NOT NULL,
  `ordre_affichage_cat` int(11) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

CREATE TABLE `ligne_ticket` (
  `id_ligne_ticket` int(11) NOT NULL,
  `id_ticket` int(11) NOT NULL,
  -- À quel groupe du décompte (voir `ticket_menu`) ce plat commandé est rattaché : détermine
  -- si son prix suit celui du menu de ce groupe ou le tarif à la carte. NULL uniquement si le
  -- groupe a été supprimé après coup (voir contrainte ON DELETE SET NULL plus bas).
  `id_ticket_menu` int(11) DEFAULT NULL,
  `id_plat` int(11) NOT NULL,
  `commentaire` varchar(255) DEFAULT NULL,
  `Etat` enum(
    'En saisie',
    'Demandé',
    'En cours',
    'Prêt',
    'Servi'
  ) DEFAULT 'En saisie'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

-- Réglages globaux de l'application (une seule ligne, id=1). plan_salle_actif contrôle si
-- l'écran service affiche le plan de salle visuel (glisser-déposer) ou la liste de tables
-- classique — modifiable par l'administrateur, sans passer par un déploiement. sommelier_distinct
-- : par défaut (0), les boissons de la catégorie "sommelier" (vins) sont traitées comme
-- n'importe quelle boisson et apparaissent sur l'écran bar — la plupart des restaurants n'ont
-- qu'un seul poste boissons. Un établissement avec un sommelier dédié peut activer ce réglage
-- (1) pour lui donner son propre écran (voir /sommelier) et retirer les vins de l'écran bar.
-- Les dimensions de la salle (largeur/hauteur) ne sont plus ici : un restaurant peut avoir
-- plusieurs salles, chacune avec ses propres dimensions — voir la table `salle`.
CREATE TABLE `parametre` (
  `id` int(11) NOT NULL DEFAULT 1,
  `plan_salle_actif` tinyint(1) NOT NULL DEFAULT 1,
  `sommelier_distinct` tinyint(1) NOT NULL DEFAULT 0
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

CREATE TABLE `menu` (
  `id_menu` int(11) NOT NULL,
  `nom_menu` varchar(50) NOT NULL DEFAULT 'nom du menu',
  `PU` float NOT NULL DEFAULT '0',
  `description` text,
  `date_menu` date DEFAULT NULL,
  `vu` int(11) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

-- `supplement` est le "prix au menu" d'un plat : 0 (par défaut) = inclus dans le forfait du
-- menu, une valeur positive = ce que ce plat ajoute au forfait dans CE menu précisément. Propre
-- à chaque association menu↔plat plutôt qu'au plat lui-même : le même plat peut être inclus
-- gratuitement dans un menu et coûter un supplément dans un autre. Ne concerne pas les boissons,
-- toujours facturées à `plat.PU_carte` (voir TicketController::show).
CREATE TABLE `menu_contient_plat` (
  `id_menu` int(11) NOT NULL,
  `id_plat` int(11) NOT NULL,
  `supplement` float(11, 2) NOT NULL DEFAULT 0.00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

CREATE TABLE `plat` (
  `id_plat` int(11) NOT NULL,
  `nom_plat` varchar(50) NOT NULL DEFAULT 'nom du plat',
  `description` text NOT NULL,
  `type_plat` varchar(10) NOT NULL DEFAULT 'entplades',
  `PU_carte` float(11, 2) NOT NULL DEFAULT '0.00',
  `id_sous_cat` int(11) DEFAULT '1',
  `vu` int(11) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

-- Une salle du restaurant (un restaurant mono-établissement peut tout de même avoir plusieurs
-- salles : terrasse, salle principale, salon privé...). Chaque salle a son propre plan, avec ses
-- propres dimensions réelles (cm, échelle 1 cm = 1 px comme pour les tables) — remplace
-- l'ancien réglage global unique `parametre.salle_largeur/salle_hauteur`.
CREATE TABLE `salle` (
  `id_salle` int(11) NOT NULL,
  `nom_salle` varchar(50) NOT NULL DEFAULT 'Salle',
  `largeur` int(11) NOT NULL DEFAULT 900,
  `hauteur` int(11) NOT NULL DEFAULT 600,
  `ordre_affichage` int(11) NOT NULL DEFAULT 1
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

-- Associe un menu à une ou plusieurs salles précises (ex. un menu "Terrasse" qui n'a de sens que
-- dans cette salle-là). La règle porte sur la SALLE, pas sur le menu : une salle qui n'a ELLE-MÊME
-- aucune ligne ici n'a jamais été configurée et propose donc tous les menus (cas par défaut, celui
-- d'un établissement à salle unique qui n'a jamais besoin d'y toucher) ; dès qu'une salle a AU
-- MOINS une ligne, elle devient restreinte à exactement cette liste — un menu absent de sa liste
-- n'y apparaît pas, même s'il n'est associé à aucune autre salle par ailleurs (voir
-- MenuController::index).
CREATE TABLE `salle_menu` (
  `id_salle` int(11) NOT NULL,
  `id_menu` int(11) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

CREATE TABLE `sgr_table` (
  `id_table` int(11) NOT NULL,
  `numero_table` int(11) NOT NULL,
  `type_table` varchar(3) NOT NULL,
  -- Toute table appartient à exactement une salle, et une seule : elle ne peut être placée que
  -- sur le plan de cette salle (voir docs/technique/02-base-de-donnees.md).
  `id_salle` int(11) NOT NULL,
  `id_serveur` int(11) DEFAULT NULL,
  `vu` int(1) NOT NULL,
  `left_position` INT NOT NULL,
  `top_position` INT NOT NULL,
  -- Diamètre (cm) : n'a de sens que pour une table ronde (type_table = 'RON'), 120 cm par défaut.
  `diametre` INT NOT NULL DEFAULT 120,
  -- Orientation (0 ou 90°) : n'a de sens que pour une table carrée/rectangulaire, détermine sur
  -- quels côtés opposés les chaises sont dessinées.
  `rotation` INT NOT NULL DEFAULT 0
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

-- Éléments fixes de la salle (bar, caisse, portes, sommelier) affichés sur le plan aux côtés des
-- tables : déplaçables et redimensionnables librement, sans dimension "réelle" imposée comme les
-- tables. type_element : BAR | CAISSE | PORTE | SOMMELIER. libelle : texte libre (utile surtout
-- pour distinguer plusieurs portes, ex. "Entrée cuisine" / "Entrée client"). Comme les tables,
-- un élément appartient à une salle précise et n'apparaît que sur le plan de celle-ci.
CREATE TABLE `sgr_element` (
  `id_element` int(11) NOT NULL,
  `type_element` varchar(10) NOT NULL,
  `libelle` varchar(50) DEFAULT NULL,
  `id_salle` int(11) NOT NULL,
  `left_position` int(11) NOT NULL DEFAULT 0,
  `top_position` int(11) NOT NULL DEFAULT 0,
  `largeur` int(11) NOT NULL DEFAULT 100,
  `hauteur` int(11) NOT NULL DEFAULT 60
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

CREATE TABLE `sous_categorie` (
  `id_sous_cat` int(11) NOT NULL,
  `id_cat` int(11) NOT NULL,
  `nom_sous_cat` varchar(30) NOT NULL,
  `ordre_aff_sous_cat` int(11) NOT NULL,
  `couleur` varchar(30) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

CREATE TABLE `ticket` (
  `id_ticket` int(11) NOT NULL,
  `id_table` int(11) NOT NULL,
  `nb_couvert` int(11) NOT NULL,
  `statut` varchar(11) NOT NULL,
  `commentaire` varchar(255) NOT NULL,
  `ordre` int(11) NOT NULL,
  `date_c` datetime DEFAULT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

-- Le "décompte" d'un ticket : une ligne par groupe de convives ayant choisi le même menu (ou
-- aucun). `id_menu` NULL désigne le groupe "à la carte" (pas de forfait, chaque plat facturé à
-- `plat.PU_carte`). `ticket.nb_couvert` est la somme des `quantite` de ces groupes, recalculée
-- par l'API à chaque création/modification/suppression d'un groupe (voir TicketMenuController).
CREATE TABLE `ticket_menu` (
  `id_ticket_menu` int(11) NOT NULL,
  `id_ticket` int(11) NOT NULL,
  `id_menu` int(11) DEFAULT NULL,
  `quantite` int(11) NOT NULL DEFAULT 1
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

CREATE TABLE `user` (
  `id_user` int(11) NOT NULL,
  `login` varchar(30) NOT NULL,
  `role` varchar(30) NOT NULL,
  `mdp` varchar(255) NOT NULL,
  `image` varchar(255) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

ALTER TABLE
  `parametre`
ADD
  PRIMARY KEY (`id`);

INSERT INTO `parametre` (`id`, `plan_salle_actif`, `sommelier_distinct`) VALUES (1, 1, 0);

ALTER TABLE
  `categorie_plat`
ADD
  PRIMARY KEY (`id_cat`);

ALTER TABLE
  `ligne_ticket`
ADD
  PRIMARY KEY (`id_ligne_ticket`),
ADD
  KEY `id_ticket` (`id_ticket`),
ADD
  KEY `id_plat` (`id_plat`),
ADD
  KEY `id_ticket_menu` (`id_ticket_menu`);

ALTER TABLE
  `menu`
ADD
  PRIMARY KEY (`id_menu`);

ALTER TABLE
  `menu_contient_plat`
ADD
  PRIMARY KEY (`id_menu`, `id_plat`),
ADD
  KEY `id_plat` (`id_plat`);

ALTER TABLE
  `plat`
ADD
  PRIMARY KEY (`id_plat`),
ADD
  KEY `fk_plat_souscat` (`id_sous_cat`);

ALTER TABLE
  `salle`
ADD
  PRIMARY KEY (`id_salle`);

-- Toute installation démarre avec une salle par défaut (reprenant les anciennes dimensions
-- globales 900×600) : les tables/éléments existants doivent toujours pouvoir référencer une
-- salle valide, et l'admin a besoin d'au moins une salle pour créer sa première table.
INSERT INTO `salle` (`id_salle`, `nom_salle`, `largeur`, `hauteur`, `ordre_affichage`) VALUES (1, 'Salle principale', 900, 600, 1);

ALTER TABLE
  `salle_menu`
ADD
  PRIMARY KEY (`id_salle`, `id_menu`),
ADD
  KEY `id_menu` (`id_menu`);

ALTER TABLE
  `sgr_table`
ADD
  PRIMARY KEY (`id_table`),
ADD
  KEY `sgr_table_ibfk_1` (`id_serveur`),
ADD
  KEY `id_salle` (`id_salle`);

ALTER TABLE
  `sgr_element`
ADD
  PRIMARY KEY (`id_element`),
ADD
  KEY `id_salle` (`id_salle`);

ALTER TABLE
  `sous_categorie`
ADD
  PRIMARY KEY (`id_sous_cat`),
ADD
  KEY `fk_souscat_cat` (`id_cat`);

ALTER TABLE
  `ticket`
ADD
  PRIMARY KEY (`id_ticket`),
ADD
  KEY `ticket_ibfk_1` (`id_table`);

ALTER TABLE
  `ticket_menu`
ADD
  PRIMARY KEY (`id_ticket_menu`),
ADD
  KEY `id_ticket` (`id_ticket`),
ADD
  KEY `id_menu` (`id_menu`);

ALTER TABLE
  `user`
ADD
  PRIMARY KEY (`id_user`);

ALTER TABLE
  `categorie_plat`
MODIFY
  `id_cat` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 4;

ALTER TABLE
  `ligne_ticket`
MODIFY
  `id_ligne_ticket` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 22408;

ALTER TABLE
  `menu`
MODIFY
  `id_menu` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 60;

ALTER TABLE
  `plat`
MODIFY
  `id_plat` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 106;

ALTER TABLE
  `salle`
MODIFY
  `id_salle` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 2;

ALTER TABLE
  `sgr_table`
MODIFY
  `id_table` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 11;

ALTER TABLE
  `sgr_element`
MODIFY
  `id_element` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 1;

ALTER TABLE
  `sous_categorie`
MODIFY
  `id_sous_cat` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 19;

ALTER TABLE
  `ticket`
MODIFY
  `id_ticket` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 51;

ALTER TABLE
  `ticket_menu`
MODIFY
  `id_ticket_menu` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 1;

ALTER TABLE
  `user`
MODIFY
  `id_user` int(11) NOT NULL AUTO_INCREMENT,
  AUTO_INCREMENT = 16;

ALTER TABLE
  `ligne_ticket`
ADD
  CONSTRAINT `ligne_ticket_ibfk_1` FOREIGN KEY (`id_ticket`) REFERENCES `ticket` (`id_ticket`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD
  CONSTRAINT `ligne_ticket_ibfk_2` FOREIGN KEY (`id_plat`) REFERENCES `plat` (`id_plat`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD
  CONSTRAINT `ligne_ticket_ibfk_3` FOREIGN KEY (`id_ticket_menu`) REFERENCES `ticket_menu` (`id_ticket_menu`) ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE
  `menu_contient_plat`
ADD
  CONSTRAINT `menu_contient_plat_ibfk_1` FOREIGN KEY (`id_menu`) REFERENCES `menu` (`id_menu`),
ADD
  CONSTRAINT `menu_contient_plat_ibfk_2` FOREIGN KEY (`id_plat`) REFERENCES `plat` (`id_plat`);

ALTER TABLE
  `plat`
ADD
  CONSTRAINT `fk_plat_souscat` FOREIGN KEY (`id_sous_cat`) REFERENCES `sous_categorie` (`id_sous_cat`);

ALTER TABLE
  `salle_menu`
ADD
  CONSTRAINT `salle_menu_ibfk_1` FOREIGN KEY (`id_salle`) REFERENCES `salle` (`id_salle`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD
  CONSTRAINT `salle_menu_ibfk_2` FOREIGN KEY (`id_menu`) REFERENCES `menu` (`id_menu`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE
  `sgr_table`
ADD
  CONSTRAINT `sgr_table_ibfk_1` FOREIGN KEY (`id_serveur`) REFERENCES `user` (`id_user`),
ADD
  CONSTRAINT `sgr_table_ibfk_2` FOREIGN KEY (`id_salle`) REFERENCES `salle` (`id_salle`);

ALTER TABLE
  `sgr_element`
ADD
  CONSTRAINT `sgr_element_ibfk_1` FOREIGN KEY (`id_salle`) REFERENCES `salle` (`id_salle`);

ALTER TABLE
  `sous_categorie`
ADD
  CONSTRAINT `fk_souscat_cat` FOREIGN KEY (`id_cat`) REFERENCES `categorie_plat` (`id_cat`);

ALTER TABLE
  `ticket`
ADD
  CONSTRAINT `ticket_ibfk_1` FOREIGN KEY (`id_table`) REFERENCES `sgr_table` (`id_table`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE
  `ticket_menu`
ADD
  CONSTRAINT `ticket_menu_ibfk_1` FOREIGN KEY (`id_ticket`) REFERENCES `ticket` (`id_ticket`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD
  CONSTRAINT `ticket_menu_ibfk_2` FOREIGN KEY (`id_menu`) REFERENCES `menu` (`id_menu`);

COMMIT;