Cannot add or update a child row: a foreign key constraint fails (`festiuto`.`evenement`, CONSTRAINT `evenement_ibfk_1` FOREIGN KEY (`idG`) REFERENCES `groupe` (`idG`))INSERT INTO EVENEMENT (idG, nomE, heureDebutE, heureFinE, dateDebutE, dateFinE) VALUES
    (1, 'Concert Groupe 1', '9:00:00', '10:00:00', '2024-07-21', '2024-07-21'),
    (2, 'Concert Groupe 2', '13:00:00', '14:00:00', '2024-07-21', '2024-07-21'),
    (3, 'Concert Groupe 3', '17:00:00', '18:00:00', '2024-07-21', '2024-07-21');. -- Table USER

INSERT INTO FAQ (question, reponse) VALUES
    ('Quand aura lieu le festival ?', "Le festival aura lieu le 30 juillet 2024."),
    ('Où aura lieu le festival ?', "Le festival aura lieu à Nantes."),
    ('Quelles sont les horaires de chaque jour du festival ?', "Le festival aura lieu de 18h à 23h."),
    ('Y a-t-il un camping sur place ?', "Oui, un camping sera disponible à proximité du site du festival pour offrir aux festivaliers une expérience pratique et agréable."),
    ('Les enfants sont-ils admis ?', "Le festival est ouvert à tous les âges. Cependant, veuillez noter que certaines zones ou activités peuvent être réservées aux personnes de plus de 18 ans."),
    ('Peut-on acheter des billets sur place ?', "Il est fortement recommandé d'acheter vos billets à l'avance. Cependant, selon la disponibilité, des billets pourraient être vendus à l'entrée du festival."),
    ('Y aura-t-il une restauration sur place ?', "Oui, il y aura une variété de stands de restauration offrant une large sélection de plats pour satisfaire tous les goûts et régimes alimentaires."),
    ('Les animaux de compagnie sont-ils autorisés ?', "Malheureusement, les animaux de compagnie ne seront pas autorisés à l'intérieur du festival pour des raisons de sécurité et de confort de tous les participants."),
    ("Est-il possible d'y accéder en transports en commun ?", "Oui, le site du festival est facilement accessible en transport en commun. Des navettes spéciales pourront également être mises en place pour faciliter les déplacements."),
    ('Est-il possible de sortir et de revenir une fois entré dans le festival ?', "Oui, les festivaliers pourront sortir et entrer à nouveau dans le festival en présentant leur bracelet d'entrée valide."),
    ('Quels sont les moyens de paiement acceptés ?', "Les paiements en espèces et par carte bancaire seront acceptés sur le site du festival."),
    ('Est-il possible de payer avec des espèces sur place ?', "Oui, des points de vente acceptant les espèces seront disponibles sur le site du festival. Cependant, nous encourageons également l'utilisation de cartes de débit ou de crédit pour plus de commodité."),
    ('Comment puis-je me porter volontaire pour travailler au festival ?', "Nous sommes toujours à la recherche de bénévoles enthousiastes pour rejoindre notre équipe. Veuillez consulter la section 'Bénévolat' sur notre site web pour plus d'informations sur la manière de postuler."),
    ('Y a-t-il des parkings disponibles près du site du festival ?', "Oui, plusieurs parkings seront disponibles aux alentours du parc des expositions de la Beaujoire pour les véhicules des festivaliers."),
    ("Les billets sont-ils remboursables en cas d'annulation ?", "Les billets ne sont généralement pas remboursables. Cependant, veuillez consulter nos politiques d'annulation pour toute information spécifique sur les remboursements."),
    ('Proposez-vous des activités pour les personnes à mobilité réduite ?', "Oui, nous nous efforçons de rendre le festival accessible à tous. Des installations spéciales seront mises en place pour garantir une expérience agréable aux personnes à mobilité réduite.");

INSERT INTO USER (pseudoUser, mdpUser, emailUser, statutUser)
VALUES
    ('irvyncsm', 'abc', 'irvyncsm@gmail.com', 'user'),
    ('admin', 'admin', '', 'admin');

-- Insérer des données dans la table FESTIVAL
INSERT INTO FESTIVAL (nomF, villeF, dateDebutF, dateFinF) VALUES
    ('Festival 1', 'Ville 1', '2024-08-01', '2024-08-05'),
    ('Festival 2', 'Ville 2', '2024-07-15', '2024-07-20'),
    ('Festival 3', 'Ville 3', '2024-08-01', '2024-08-03');

-- Insérer des données dans la table LIEU
INSERT INTO LIEU (idF, nomL, adresseL, jaugeL) VALUES
    (1, 'Lieu 1', 'Adresse Lieu 1', 1000),
    (1, 'Lieu 2', 'Adresse Lieu 2', 1500),
    (1, 'Lieu 3', 'Adresse Lieu 3', 500),

    (2, 'Lieu 1', 'Adresse Lieu 1', 1000),
    (2, 'Lieu 2', 'Adresse Lieu 2', 1500),
    (2, 'Lieu 3', 'Adresse Lieu 3', 500);

-- Insérer des données dans la table HEBERGEMENT
INSERT INTO HEBERGEMENT (nomH, limitePlacesH, adresseH) VALUES
    ('Hébergement 1', 100, 'Adresse Hébergement 1'),
    ('Hébergement 2', 200, 'Adresse Hébergement 2'),
    ('Hébergement 3', 500, 'Adresse Hébergement 3');

-- Insérer des données dans la table GROUPE
INSERT INTO GROUPE (idH, nomG, descriptionG) VALUES
    (1, 'Saturn Citizen', 'Saturn Citizen est un groupe de rap français originaire de La Réunion et basé à Lyon, composé de Bushi et Mussy.
    Créé durant les années de collège de ces deux derniers, le groupe a fait partie intégrante du collectif Lyonzon de 2018 à 2023. 
    Il a également intégré le troisième membre Azur de 2018 à 2020 qui avait déjà collaboré avec Bushi en 2016 sous le nom Cool Kids pour un projet éponyme.'),

    (1, 'Opium', "Opium est un label américain et une agence de création fondée par le rappeur et chanteur américain Playboi Carti. Le label compte actuellement parmi ses membres Carti, les rappeurs américains Ken Carson et Destroy Lonely, ainsi que le duo de hip-hop Homixide Gang.
    Musicalement, le collectif Opium partageait un son similaire, avec des synthés sombres, grinçants et avant-gardistes mélangés à un beat rageur rappelant l'ère du punk rock des années 70 et 80. 
    Ce son expérimental s'éloignait du genre hip-hop trap actuel et s'était attiré les faveurs d'un groupe culte."),


    (1, 'New Wave', 'La Fève, Khali, J9ueve, Sonbest, 99 ou encore DMS : tous composent cette scène avant-gardiste du rap français souvent surnommée « nouvelle vague ». Mais ici, pas question de faire du cinéma : avec une spontanéité criante, ces jeunes rappeurs construisent une musique propre à leur inspirations personnelles, 
    et bâtissent ensemble une dynamique artistique pleine d’expérimentations précieuses pour le rap français.');

-- Insérer des données dans la table MEMBRE_GROUPE
INSERT INTO MEMBRE_GROUPE (idG, nomMG, prenomMG, nomDeSceneMG, descriptionA) VALUES
    (1, 'Bushi', 'Bushi', 'Bushi', 'BUSHI, jeune rappeur de Lyon, fait énormément parler de lui ces derniers temps par rapport à ses diverses apparitions aux quatre coins du monde ainsi que sa productivité et 
    sa communication qui font tourner beaucoup de mystère autour de ce personnage.L’artiste peut paraître des plus underground. Egotrip monstre, placements particuliers, ces éléments font sa force. Il se démarque par sa prestance, 
    sa nonchalance et ses placements sortis de nulle part. Un vrai rappeur US en somme.'),


    (1, 'Mussy', 'Mussy', 'Mussy', "Mussy est un rappeur français d'origine Tutsi (Rwanda) ayant grandi à La Réunion. Il est membre du groupe Saturn Citizen et du collectif Lyonzon. Le rappeur crée Saturn Citizen avec son ami Bushi durant ses années de collège et rejoint Lyonzon en 2017. Cependant, il reste très discret et c'est réellement lors du “Freestyle Arah #3” que Mussy officialise son appartenance et signe son grand retour au sein des deux groupes, 
    avant de s'envoler à Lyon (69). L'artiste dévoile en 2020 son premier projet en solo, intitulé Jig."),

    (2, 'Playboi', 'Jordan', 'Playboi Carti', "Jordan Terrell Carter, plus connu sous le nom de Playboi Carti, est un rappeur, chanteur et compositeur américain. Il est né le 13 septembre 1996 à Atlanta, en Géorgie. 
    Reconnu pour son style musical expérimental, passant volontiers de sonorités douces et vaporeuses à des ambiances trash et gothiques, il se démarque aussi par la rareté de ses apparitions médiatiques."),

    (2, 'Ken', 'Ken', 'Ken Carson', 'Kenyatta Lee Frazier Jr. (né le 11 avril 2000), connu professionnellement sous le nom de Ken Carson est un rappeur, auteur-compositeur et producteur de disques américain. Il est connu pour son album studio X qui a culminé au numéro 115 du Billboard 2003.
    Son style de musique est appelée de la Rage Music ou Opium Music en réference avec le label du meme nom dans lequel il est signé. Son style est comparable a des artistes tel que Destroy Lonely, Yeat, Playboi Carti, le groupe Homixide Gang , ou encore Lancey Foux.'),
        
    (2, 'Destroy', 'Destroy', 'Destroy Lonely', "Bobby Wardell Sandimanie, connu professionnellement sous le nom de Destroy Lonely, est un rappeur et auteur-compositeur-interprète américain. Son premier album studio, If Looks Could Kill (2023), a débuté à la 18e place du Billboard 200 américain. Auparavant, sa cinquième mixtape, 
        No Stylist (2022), a marqué sa première entrée dans le classement en se classant à la 91e place."),

    (2, 'Homixide', 'Homixide', 'Homixide Gang', "Tous deux âgés de 22 ans, Homixide Meechie et Homixide Beno forme le duo Homixide Gang. Avec leur premier EP Snotty World, les deux rappeurs originaires d’Atlanta se font rapidement remarquer en 2021 avec le titre SSN. Un succès qui leur permet de passer à la vitesse supérieure en signant avec Opium, le label de Playboi Carti. S’en suit un premier album Homixide Lifestyle, puis SNOT OR NOT, leur deuxième opus fraichement dévoilé en avril dernier. Directement classé dans le top 10 des nouveaux albums sur Spotify après la sortie, 
    Homixide Beno et Homixide Meechie continuent leur ascension, prouvant qu’avec de la persévérance, rien n’est impossible !"),

    (3, 'La Fève', 'La Fève', 'La Fève', "La Fève, de son vrai nom Louis Ambroise Germain1, est un rappeur et producteur français.
Il est un membre du mouvement musical new wave du hip-hop français. Sa musique est jugée innovante, utilisant une sélection éclectique de flows, productions et refrains."),


    (3, 'Khali', 'Khali', 'Khali', "Khali, né à Lyon le 20 novembre 1999 et de son vrai nom Khalil Lakbir, est un rappeur, producteur et chanteur franco-marocain. Il fait partie du mouvement musical new wave du hip-hop français."),

    (3, 'J9ueve', 'J9ueve', 'J9ueve', "J9ueve, de son vrai nom Jules Vincent est un rappeur et producteur français. Il est un membre clé du mouvement New Wave au sein du rap français.
     l'instar de nombreux rappeurs du mouvement New Wave, J9ueve se fait connaître via la plateforme Soundcloud, dès 2019. Il est réputé pour son style mélancolique, ses ambiances romantiques, sa voix atypique et sa musicalité novatrice. Il est signé chez le label ALSO/A+LSO3"),

    (3, 'DMS', 'DMS', 'DMS', "DMS est un rappeur français originaire des Hauts-de-Seine (92). Affilié au studio 99 à ses débuts, il créé en 2021 le label Ciel.
De 2019 à 2021, il travaille sur son premier projet Rideaux bleus, qu'il sort en décembre de cette dernière année. Sept mois plus tard, il dévoile l'EP YEYEYE, comprenant des collaborations avec EDGE et Malo.
En mars 2023, il dévoile son deuxième projet, VAGALAME, où J9ueve, Khali et Rounhaa y sont présents.");







    -- (1, 'Vlad', 'Cauchemar', 'Vladimir Cauchemar', 'Description pour Vladimir Cauchemar'),
    -- (2, 'Booba', 'Elie', 'Booba', 'Description pour Booba'),
    -- (3, 'Freeze', 'Hugo', 'Freeze Corleone', 'Description pour Freeze Corleone'),
    -- (4, 'Damso', 'William', 'Damso', 'Description pour Damso'),
    -- (5, 'Ashe', 'Achille', 'Ashe 22', 'Description pour Ashe 22'),
    -- (6, 'Heuss', 'Karim', "Heuss l'Enfoiré", 'Description pour Heuss lEnfoiré'),
    -- (7, 'Zola', 'Evans', 'Zola', 'Description pour Zola'),
    -- (8, 'Sch', 'Julien', 'Sch', 'Description pour Sch'),
    -- (9, 'H', 'Hugo', 'H Jeunecrack', 'Description pour H Jeunecrack'),
    -- (10, 'Luther', 'Luther', 'Luther', 'Description pour Luther');

-- Insérer des données dans la table INSTRUMENT
INSERT INTO INSTRUMENT (idMG, nomI) VALUES
    (1, 'DJ'),
    (2, 'Chanteur'),
    (3, 'Chanteur'),
    (4, 'Chanteur'),
    (5, 'Chanteur'),
    (6, 'Chanteur'),
    (7, 'Chanteur'),
    (8, 'Chanteur'),
    (9, 'Chanteur'),
    (10, 'Chanteur');

-- Insérer des données dans la table LIEN_VIDEO
INSERT INTO LIEN_VIDEO (idG, video) VALUES
    (1, 'Video 1'),
    (1, 'Video 2'),
    (2, 'Video 1'),
    (3, 'Video 1'),
    (3, 'Video 2'),
    (3, 'Video 3'),
    (4, 'Video 1'),
    (5, 'Video 1'),
    (6, 'Video 1'),
    (7, 'Video 1'),
    (8, 'Video 1'),
    (9, 'Video 1'),
    (10, 'Video 1');

-- Insérer des données dans la table LIEN_RESEAUX_SOCIAUX
INSERT INTO LIEN_RESEAUX_SOCIAUX (idG, reseau) VALUES
    (1, 'https://www.youtube.com/channel/UCQxeWQ_K8aQ0KOXMDi03H5Q'),
    (1, 'https://www.instagram.com/saturnciti/'),
    (1, 'https://open.spotify.com/intl-fr/artist/7siKy5Wrq7TwvyJ21KushJ'),
    (2, 'Réseau 1'),
    (3, 'Réseau 1'),
    (3, 'Réseau 2'),
    (3, 'Réseau 3'),

-- Insérer des données dans la table SPECTATEUR
INSERT INTO SPECTATEUR (nomS, prenomS, adresseS, emailS, mdpS) VALUES
    ('Spectateur 1', 'Prénom 1', 'Adresse 1', 'email1@example.com', 'mdp1'),
    ('Spectateur 2', 'Prénom 2', 'Adresse 2', 'email2@example.com', 'mdp2'),
    ('Spectateur 3', 'Prénom 3', 'Adresse 3', 'email3@example.com', 'mdp3'),
    ('Spectateur 4', 'Prénom 4', 'Adresse 4', 'email4@example.com', 'mdp4'),
    ('Spectateur 5', 'Prénom 5', 'Adresse 5', 'email5@example.com', 'mdp5');

-- Insérer des données dans la table STYLE_MUSICAL
INSERT INTO STYLE_MUSICAL (nomSt) VALUES
    ('Style 1'),
    ('Style 2'),
    ('Style 3');


-- Insérer des données dans la table EVENEMENT
INSERT INTO EVENEMENT (idG, nomE, heureDebutE, heureFinE, dateDebutE, dateFinE) VALUES
    (1, 'Concert Groupe 1', '9:00:00', '10:00:00', '2024-07-21', '2024-07-21'),
    (2, 'Concert Groupe 2', '13:00:00', '14:00:00', '2024-07-21', '2024-07-21'),
    (3, 'Concert Groupe 3', '17:00:00', '18:00:00', '2024-07-21', '2024-07-21');

INSERT INTO TYPE_BILLET(duree) VALUES
    (1),
    (2),
    (3);

-- Insérer des données dans la table CONCERT
INSERT INTO CONCERT (idE, tempsMontage, tempsDemontage) VALUES
    (1, '01:00:00', '01:00:00'),
    (2, '01:00:00', '01:00:00'),
    (3, '01:00:00', '01:00:00'),
    (4, '01:00:00', '01:00:00'),
    (5, '01:00:00', '01:00:00'),
    (6, '01:00:00', '01:00:00'),
    (7, '01:00:00', '01:00:00'),
    (8, '01:00:00', '01:00:00'),
    (9, '01:00:00', '01:00:00'),
    (10, '01:00:00', '01:00:00');

INSERT INTO GROUPE_STYLE (idG, idSt) VALUES
    (1, 1),
    (2, 2),
    (3, 3),
    (4, 1),
    (5, 2),
    (6, 3),
    (7, 1),
    (8, 2),
    (9, 3),
    (10, 1);

-- Insérer des données dans la table PROGRAMMER
INSERT INTO PROGRAMMER (idF, idG, idH, dateArrivee, heureArrivee, dateDepart, heureDepart) VALUES
    (1, 1, 1, '2024-08-06', '08:00:00', '2024-08-07', '16:00:00');

-- test des triggers

-- Impossible d'acheter un billet pour un événement qui a déjà eu lieu
INSERT INTO BILLET (idF, idType, idS, prix, dateAchat, dateDebutB, dateFinB) VALUES
    (1, 1, 1, 50, '2024-10-01', '2024-07-21', '2024-07-21');

-- La durée du billet est trop grande par rapport à celle du festival
INSERT INTO BILLET (idF, idType, idS, prix, dateAchat, dateDebutB, dateFinB) VALUES
    (3, 1, 1, 50, '2024-08-01', '2024-08-01', '2024-08-06');

-- Le groupe ne peut pas arriver avant le début du festival
INSERT INTO PROGRAMMER (idF, idG, idH, dateArrivee, heureArrivee, dateDepart, heureDepart) VALUES
    (1, 1, 1, '2024-05-06', '08:00:00', '2024-05-07', '16:00:00');CREATE DATABASE IF NOT EXISTS `FESTIUTO` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE FESTIUTO;

CREATE TABLE FAQ (
    idFaq INT NOT NULL AUTO_INCREMENT,
    question VARCHAR(9999) NOT NULL,
    reponse VARCHAR(9999) NOT NULL,
    PRIMARY KEY(idFaq)
);

CREATE TABLE USER(
    idUser INT NOT NULL AUTO_INCREMENT,
    pseudoUser VARCHAR(99) NOT NULL UNIQUE,
    mdpUser VARCHAR(9999) NOT NULL,
    codeTempUser VARCHAR(6),
    emailUser VARCHAR(99) UNIQUE,
    statutUser VARCHAR(99) NOT NULL,
    PRIMARY KEY(idUser)
);

CREATE TABLE FESTIVAL (
    idF INT NOT NULL AUTO_INCREMENT,
    nomF VARCHAR(50) NOT NULL,
    villeF VARCHAR(50) NOT NULL,
    dateDebutF DATE NOT NULL,
    dateFinF DATE NOT NULL,
    PRIMARY KEY (idF)
);

CREATE TABLE BILLET (
    idB INT NOT NULL AUTO_INCREMENT,
    idF INT NOT NULL,
    idType INT NOT NULL,
    idS INT NOT NULL,
    prix INT,
    dateAchat DATE NOT NULL,
    dateDebutB DATE NOT NULL CHECK (dateDebutB <= dateFinB),
    dateFinB DATE NOT NULL CHECK (dateFinB >= dateDebutB),
    PRIMARY KEY (idB)
);

CREATE TABLE TYPE_BILLET (
    idType INT NOT NULL AUTO_INCREMENT,
    duree INT NOT NULL CHECK (duree > 0),
    PRIMARY KEY (idType)
);

CREATE TABLE SPECTATEUR (
    idS INT NOT NULL AUTO_INCREMENT,
    nomS VARCHAR(50) NOT NULL,
    prenomS VARCHAR(50) NOT NULL,
    adresseS VARCHAR(50) NOT NULL,
    emailS VARCHAR(50) NOT NULL,
    mdpS VARCHAR(50) NOT NULL,
    PRIMARY KEY (idS)
);

CREATE TABLE LIEU (
    idL INT NOT NULL AUTO_INCREMENT,
    idF INT NOT NULL,
    nomL VARCHAR(50) NOT NULL,
    adresseL VARCHAR(50) NOT NULL,
    jaugeL INT NOT NULL CHECK (jaugeL > 0),
    PRIMARY KEY (idL)
);

CREATE TABLE PROGRAMMER (
    idF INT NOT NULL,
    idG INT NOT NULL,
    idH INT NOT NULL,
    dateArrivee DATE NOT NULL,
    heureArrivee TIME NOT NULL,
    dateDepart DATE NOT NULL,
    heureDepart TIME NOT NULL,
    PRIMARY KEY (idF, idG, idH)
);

CREATE TABLE HEBERGEMENT (
    idH INT NOT NULL AUTO_INCREMENT,
    nomH VARCHAR(50) NOT NULL,
    limitePlacesH INT NOT NULL CHECK (limitePlacesH > 0),
    adresseH VARCHAR(50) NOT NULL,
    PRIMARY KEY (idH)
);

CREATE TABLE GROUPE (
    idG INT NOT NULL AUTO_INCREMENT,
    idH INT,
    nomG VARCHAR(50) NOT NULL,
    descriptionG VARCHAR(1000) NOT NULL,
    imgG LONGBLOB,
    PRIMARY KEY (idG)
);

CREATE TABLE MEMBRE_GROUPE (
    idMG INT NOT NULL AUTO_INCREMENT,
    idG INT NOT NULL,
    nomMG VARCHAR(50) NOT NULL,
    prenomMG VARCHAR(50) NOT NULL,
    nomDeSceneMG VARCHAR(50) NOT NULL,
    descriptionA VARCHAR(1000),
    PRIMARY KEY (idMG)
);

CREATE TABLE INSTRUMENT (
    idI INT NOT NULL AUTO_INCREMENT,
    idMG INT NOT NULL,
    nomI VARCHAR(50) NOT NULL,
    PRIMARY KEY (idI)
);

CREATE TABLE STYLE_MUSICAL (
    idSt INT NOT NULL AUTO_INCREMENT,
    nomSt VARCHAR(50) NOT NULL,
    PRIMARY KEY (idSt)
);

CREATE TABLE LIEN_VIDEO (
    idLV INT NOT NULL AUTO_INCREMENT,
    idG INT NOT NULL,
    video VARCHAR(50),
    PRIMARY KEY (idLV)
);

CREATE TABLE LIEN_RESEAUX_SOCIAUX (
    idLRS INT NOT NULL AUTO_INCREMENT,
    idG INT NOT NULL,
    reseau VARCHAR(50),
    PRIMARY KEY (idLRS)
);

CREATE TABLE EVENEMENT (
    idE INT NOT NULL AUTO_INCREMENT,
    idG INT,
    idL INT,
    nomE VARCHAR(50) NOT NULL,
    heureDebutE TIME NOT NULL CHECK (heureDebutE < heureFinE),
    heureFinE TIME NOT NULL CHECK (heureFinE > heureDebutE),
    dateDebutE DATE NOT NULL CHECK (dateDebutE <= dateFinE),
    dateFinE DATE NOT NULL CHECK (dateFinE >= dateDebutE),
    PRIMARY KEY (idE)
);

CREATE TABLE ACTIVITE_ANNEXE (
    idE INT NOT NULL,
    typeA VARCHAR(50) NOT NULL,
    ouvertAuPublic BOOLEAN NOT NULL,
    PRIMARY KEY (idE)
);

CREATE TABLE CONCERT (
    idE INT NOT NULL,
    tempsMontage TIME NOT NULL,
    tempsDemontage TIME NOT NULL,
    PRIMARY KEY (idE)
);

CREATE TABLE GROUPE_STYLE (
    idG INT NOT NULL,
    idSt INT NOT NULL,
    PRIMARY KEY (idG, idSt),
    FOREIGN KEY (idG) REFERENCES GROUPE (idG),
    FOREIGN KEY (idSt) REFERENCES STYLE_MUSICAL (idSt)
);

CREATE TABLE LIEN_RESEAUX_SOCIAUX_MEMBRE (
    idLRSM INT NOT NULL AUTO_INCREMENT,
    idMG INT NOT NULL,
    reseau VARCHAR(50),
    URL VARCHAR(255),
    PRIMARY KEY (idLRSM),
    FOREIGN KEY (idMG) REFERENCES MEMBRE_GROUPE (idMG)
);


ALTER TABLE BILLET ADD FOREIGN KEY (idF) REFERENCES FESTIVAL (idF);
ALTER TABLE BILLET ADD FOREIGN KEY (idType) REFERENCES TYPE_BILLET (idType);
ALTER TABLE BILLET ADD FOREIGN KEY (idS) REFERENCES SPECTATEUR (idS);

ALTER TABLE LIEU ADD FOREIGN KEY (idF) REFERENCES FESTIVAL (idF);

ALTER TABLE PROGRAMMER ADD FOREIGN KEY (idF) REFERENCES FESTIVAL (idF);
ALTER TABLE PROGRAMMER ADD FOREIGN KEY (idG) REFERENCES GROUPE (idG);
ALTER TABLE PROGRAMMER ADD FOREIGN KEY (idH) REFERENCES HEBERGEMENT (idH);

ALTER TABLE HEBERGEMENT ADD FOREIGN KEY (idG) REFERENCES GROUPE (idG);

ALTER TABLE MEMBRE_GROUPE ADD FOREIGN KEY (idG) REFERENCES GROUPE (idG);

ALTER TABLE INSTRUMENT ADD FOREIGN KEY (idMG) REFERENCES MEMBRE_GROUPE (idMG);

ALTER TABLE LIEN_VIDEO ADD FOREIGN KEY (idG) REFERENCES GROUPE (idG);

ALTER TABLE LIEN_RESEAUX_SOCIAUX ADD FOREIGN KEY (idG) REFERENCES GROUPE (idG);

ALTER TABLE ACTIVITES_ANNEXES ADD FOREIGN KEY (idE) REFERENCES EVENEMENT (idE);

ALTER TABLE CONCERT ADD FOREIGN KEY (idE) REFERENCES EVENEMENT (idE);

ALTER TABLE EVENEMENT ADD FOREIGN KEY (idG) REFERENCES GROUPE (idG);

ALTER TABLE EVENEMENT ADD FOREIGN KEY (idL) REFERENCES LIEU (idL);

-- Les Fonctions

DELIMITER |
CREATE OR REPLACE FUNCTION getNbBilletsVendus(idFestival INT) RETURNS INT
BEGIN
    IF NOT EXISTS (SELECT * FROM FESTIVAL WHERE idF = idFestival) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "Le festival n'existe pas";
    END IF;
    DECLARE nbBillets INT;
    SELECT COUNT(*) INTO nbBillets FROM BILLET WHERE idF = idFestival;
    RETURN nbBillets;  
END |
DELIMITER ;

DELIMITER |
CREATE OR REPLACE FUNCTION getGroupesByStyle(nomStyle VARCHAR(50)) RETURNS INT
BEGIN
    IF NOT EXISTS (SELECT * FROM STYLE_MUSICAL WHERE nomSt = nomStyle) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "Le style musical n'existe pas";
    END IF;
    DECLARE idStyleMusical INT;
    SELECT idSt INTO idStyleMusical FROM STYLE_MUSICAL WHERE nomSt = nomStyle;
    RETURN (SELECT COUNT(*) FROM GROUPE WHERE idSt = idStyleMusical);
END |
DELIMITER ;

DELIMITER |
CREATE OR REPLACE FUNCTION getPrixTotalBilletSpec(idSpectateur INT) RETURNS INT
BEGIN
    IF NOT EXISTS (SELECT * FROM SPECTATEUR WHERE idS = idSpectateur) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "Le spectateur n'existe pas";
    END IF;
    DECLARE totalPrix INT;
    SELECT SUM(prix) INTO totalPrix FROM BILLET WHERE idS = idSpectateur;
    RETURN totalPrix;
END |
DELIMITER ;

DELIMITER |
CREATE OR REPLACE FUNCTION majPrixBillet(idBillet INT, nouveauPrix INT)
BEGIN
    IF NOT EXISTS (SELECT * FROM BILLET WHERE idB = idBillet) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "Le billet n'existe pas";
    END IF;
    UPDATE BILLET SET prix = nouveauPrix WHERE idB = idBillet;
END |
DELIMITER ;

-- Les procédures 

DELIMITER |
CREATE OR REPLACE PROCEDURE listeFestivals()
BEGIN
    DECLARE resultat VARCHAR (500) DEFAULT 'Liste des festivals : \n';
    DECLARE fini INT DEFAULT false ;
    DECLARE idFest INT ;
    DECLARE nomFest VARCHAR (50) ;
    DECLARE villeFest VARCHAR (50) ;
    DECLARE dateDebutFest DATE ;
    DECLARE dateFinFest DATE ;
    DECLARE nbFest INT DEFAULT 0;
    DECLARE lm CURSOR FOR
        select idF , nomF , villeF, dateDebutF, dateFinF
        from FESTIVAL;

    DECLARE continue handler for not found set fini = true ;
    open lm;
    while not fini do
        fetch lm into idFest , nomFest , villeFest, dateDebutFest, dateFinFest;
        if not fini then
            set nbFest = nbFest +1;
            set resultat = concat(resultat , 'festival id', idFest, ' : ', nomFest, ' à ', villeFest, ' du ', dateDebutFest, ' au ', dateFinFest, '\n');
        end if;
        end while;
        close lm;
        set resultat = concat(resultat, 'Il y a ', nbFest , ' festival(s) en tout \n') ;

        select resultat ;
END |
DELIMITER ;

CALL listeFestivals();

-- Les triggers

-- BILLET :
-- Trigger pour vérifier la date d'achat par rapport à la fin du festival
-- delimiter |
-- create or replace trigger billetAchetable before insert on BILLET
-- for each row
-- begin
--     declare dateFinFestival DATE;
--     select dateFinF into dateFinFestival from FESTIVAL where idF = new.idF;
--     if (new.dateAchat > dateFinFestival) then
--         SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "Impossible d'acheter un billet pour un événement qui a déjà eu lieu";
--     end if;
-- end |
-- delimiter ;

-- Trigger pour vérifier la durée du billet par rapport à la durée du festival
delimiter |
create or replace trigger dureeTypeBillet before insert on BILLET
for each row
begin
    declare dureeType INT;
    declare dateDebutFestival DATE;
    declare dateFinFestival DATE;
    select duree into dureeType from TYPE_BILLET where idType = new.idType;
    select dateDebutF into dateDebutFestival from FESTIVAL where idF = new.idF;
    select dateFinF into dateFinFestival from FESTIVAL where idF = new.idF;
    if (dureeType > (DATEDIFF(dateFinFestival, dateDebutFestival))) then
        SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "La durée du billet est trop grande par rapport à celle du festival";
    end if;
end |
delimiter ;

-- Trigger pour vérifier la date d'arrivée du groupe par rapport à la date de début du festival
delimiter |
create or replace trigger dateArriveeHebergement before insert on PROGRAMMER
for each row
begin
    declare dateDebutFestival DATE;
    declare dateFinFestival DATE;
    select dateDebutF into dateDebutFestival from FESTIVAL where idF = new.idF;
    select dateFinF into dateFinFestival from FESTIVAL where idF = new.idF;
    if (new.dateArrivee < dateDebutFestival) then
        SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "Le groupe ne peut pas arriver avant le début du festival";
    end if;
end |
delimiter ;

-- Trigger pour vérifier la date d'arrivée du groupe par rapport à la date de fin du festival
delimiter |
create or replace trigger groupeArriveTropTardHebergement before insert on PROGRAMMER
for each row
begin
    declare dateArriveeGroupe DATE;
    declare dateFinFestival DATE;
    select dateArrivee into dateArriveeGroupe from PROGRAMMER where idF = new.idF and idL = new.idL and idH = new.idH;
    select dateFinF into dateFinFestival from FESTIVAL where idF = new.idF;
    if (dateArriveeGroupe > dateFinFestival) then
        SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "Le groupe ne peut pas arriver après la fin du festival";
    end if;
end |
delimiter ;


-- Trigger pour vérifier si le lieu existe déjà pour ce festival
delimiter |
create or replace trigger memeNomLieuFestival before insert on LIEU
for each row
begin
    if exists (select 1 from LIEU where idF = new.idF and nomL = new.nomL) then
        SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "Un lieu avec le même nom existe déjà pour ce festival";
    end if;
end |
delimiter ;


-- Trigger pour vérifier si un hébergement avec la même adresse existe déjà
delimiter |
create or replace trigger memeNomAdresseHebergement before insert on HEBERGEMENT
for each row
begin
    if exists (select 1 from HEBERGEMENT where nomH = new.nomH and adresseH = new.adresseH) then
        SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "Un hébergement avec le même nom et la même adresse existe déjà";
    end if;
end |
delimiter ;


-- Trigger pour vérifier si un membre avec le même nom et prénom existe déjà dans ce groupe
delimiter |
create or replace trigger memeNomPrenomMembreGroupe before insert on MEMBRE_GROUPE
for each row
begin
    if exists (select 1 from MEMBRE_GROUPE where idG = new.idG and nomMG = new.nomMG and prenomMG = new.prenomMG and nomDeSceneMG = new.nomDeSceneMG) then
        SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "Un membre avec le même nom et prénom existe déjà dans ce groupe";
    end if;
end |
delimiter ;


-- Trigger pour vérifier si un style musical avec le même nom existe déjà
delimiter |
create or replace trigger memeNomStyleMusical before insert on STYLE_MUSICAL
for each row
begin
    if exists (select 1 from STYLE_MUSICAL where nomSt = new.nomSt) then
        SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "Un style musical avec le même nom existe déjà";
    end if;
end |
delimiter ;


-- Trigger pour vérifier si un type de billet avec la même durée existe déjà
delimiter |
create or replace trigger memeDureeTypeBillet before insert on TYPE_BILLET
for each row
begin
    if exists (select 1 from TYPE_BILLET where duree = new.duree) then
        SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "Un type de billet avec la même durée existe déjà";
    end if;
end |
delimiter ;

delimiter |
create or replace trigger emailDejaUtilise before insert on SPECTATEUR
for each row
begin
    if exists (select 1 from SPECTATEUR where emailS = new.emailS) then
        SIGNAL SQLSTATE '45000' set MESSAGE_TEXT = "Cet email est déjà associé à un compte";
    end if;
end |
delimiter ;

delimiter |

CREATE TRIGGER lieuDejaUtiliseDurantHoraire BEFORE INSERT ON EVENEMENT
FOR EACH ROW
BEGIN
    DECLARE conflitTrouve INT DEFAULT 0;
    DECLARE tempsDemontageConcert TIME;
    DECLARE finEvenement TIME;
    SELECT IFNULL(MAX(c.tempsDemontage), '00:00:00') INTO tempsDemontageConcert
    FROM CONCERT c
    JOIN EVENEMENT e ON c.idE = e.idE
    WHERE e.idL = NEW.idL
    AND e.dateDebutE <= NEW.dateDebutE
    AND e.dateFinE >= NEW.dateDebutE
    AND ADDTIME(e.heureFinE, c.tempsDemontage) > NEW.heureDebutE;
    SELECT COUNT(*) INTO conflitTrouve
    FROM EVENEMENT e
    WHERE e.idL = NEW.idL
    AND e.dateDebutE = NEW.dateDebutE
    AND (
        (e.heureDebutE < NEW.heureFinE AND e.heureFinE > NEW.heureDebutE) OR
        (ADDTIME(e.heureFinE, tempsDemontageConcert) > NEW.heureDebutE)
    );
    IF conflitTrouve > 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "Un événement ou concert est déjà prévu à ce lieu et cet horaire.";
    END IF;
END |

delimiter ;

DELIMITER |

CREATE TRIGGER verifDisponibiliteGroupe BEFORE INSERT ON EVENEMENT
FOR EACH ROW
BEGIN
    DECLARE conflitExistant INT DEFAULT 0;
    DECLARE tempsMontageConcert TIME;
    IF NEW.idE IN (SELECT idE FROM CONCERT) THEN
        SET tempsMontageConcert := (SELECT tempsMontage FROM CONCERT WHERE idE = NEW.idE);
    ELSE
        SET tempsMontageConcert := '00:00:00';
    END IF;
    SELECT COUNT(*) INTO conflitExistant
    FROM EVENEMENT e
    LEFT JOIN CONCERT c ON e.idE = c.idE
    WHERE e.idG = NEW.idG
    AND e.dateDebutE = NEW.dateDebutE
    AND (
        (NEW.heureDebutE < ADDTIME(e.heureFinE, IFNULL(c.tempsDemontage, '00:00:00'))) OR
        (ADDTIME(NEW.heureDebutE, tempsMontageConcert) > e.heureDebutE AND ADDTIME(NEW.heureDebutE, tempsMontageConcert) < e.heureFinE)
    );
    IF conflitExistant > 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "Le groupe a déjà un événement prévu qui entre en conflit avec le nouvel horaire.";
    END IF;
END |

DELIMITER ;

-- Le groupe ne peut pas arriver après la fin du festival
INSERT INTO PROGRAMMER (idF, idG, idH, dateArrivee, heureArrivee, dateDepart, heureDepart) VALUES
    (1, 1, 1, '2024-10-06', '08:00:00', '2024-10-07', '16:00:00');