DELIMITER $$

DROP TRIGGER IF EXISTS `schauspieler_bri`$$
CREATE TRIGGER `schauspieler_bri`
  BEFORE INSERT ON Schauspieler
  FOR EACH ROW
BEGIN
  IF NOT film_pub_chk_geburtstag(NEW.Geburtstag) THEN
    SIGNAL SQLSTATE '60000' SET MESSAGE_TEXT = 'Geburtstag ist ungültig!';
  END IF;
END $$

DROP TRIGGER IF EXISTS `schauspieler_bru`$$
CREATE TRIGGER `schauspieler_bru`
  BEFORE UPDATE ON Schauspieler
  FOR EACH ROW
BEGIN
  IF NOT film_pub_chk_geburtstag(NEW.Geburtstag) THEN
    SIGNAL SQLSTATE '60001' SET MESSAGE_TEXT = 'Geburtstag ist ungültig!';
  END IF;
END $$





DROP TRIGGER IF EXISTS `reservierung_bri`$$
CREATE TRIGGER `reservierung_bri`
  BEFORE INSERT ON Reservierung
  FOR EACH ROW
BEGIN
  -- Logging
  INSERT INTO Reservierung_Log (ID, Vorname, Nachname, Mail, fk_Vorstellung_ID, VorheigeID, Zeitstempel, is_Erfolgreich, Methode)
    VALUES (NEW.ID, NEW.Vorname, NEW.Nachname, NEW.Mail, NEW.fk_Vorstellung_ID, NULL, CURRENT_TIMESTAMP(), 0, 'insert');
  SET @letzte_reservation_ID = LAST_INSERT_ID();

  -- Check Mail
  IF NOT res_pub_chk_mail(NEW.Mail) THEN
    SIGNAL SQLSTATE '60020' SET MESSAGE_TEXT = 'Mail-Adresse ist ungültig!';
  END IF;
END $$

DROP TRIGGER IF EXISTS `reservierung_bru`$$
CREATE TRIGGER `reservierung_bru`
  BEFORE UPDATE ON Reservierung
  FOR EACH ROW
BEGIN
  -- Logging
  INSERT INTO Reservierung_Log (ID, Vorname, Nachname, Mail, fk_Vorstellung_ID, VorheigeID, Zeitstempel, is_Erfolgreich, Methode)
    VALUES (NEW.ID, NEW.Vorname, NEW.Nachname, NEW.Mail, NEW.fk_Vorstellung_ID, OLD.ID, CURRENT_TIMESTAMP(), 0, 'insert');
  SET @letzte_reservation_ID = LAST_INSERT_ID();

  -- Check Mail
  IF NOT res_pub_chk_mail(NEW.Mail) THEN
    SIGNAL SQLSTATE '60021' SET MESSAGE_TEXT = 'Mail-Adresse ist ungültig!';
  END IF;
END $$

DROP TRIGGER IF EXISTS `reservierung_brd`$$
CREATE TRIGGER `reservierung_brd`
  BEFORE DELETE ON Reservierung
  FOR EACH ROW
BEGIN
  -- Logging
  INSERT INTO Reservierung_Log (VorheigeID, Zeitstempel, is_Erfolgreich, Methode) VALUES (OLD.ID, CURRENT_TIMESTAMP(), 0, 'delete');
  SET @letzte_reservation_ID = LAST_INSERT_ID();
END $$

DROP TRIGGER IF EXISTS `reservierung_ari`$$
CREATE TRIGGER `reservierung_ari`
  AFTER INSERT ON Reservierung
  FOR EACH ROW
BEGIN
  -- Logging
  UPDATE Reservierung_Log SET is_Erfolgreich=1, ID=NEW.ID WHERE LogID=@letzte_reservation_ID;
END $$

DROP TRIGGER IF EXISTS `reservierung_aru`$$
CREATE TRIGGER `reservierung_aru`
  AFTER UPDATE ON Reservierung
  FOR EACH ROW
BEGIN
  -- Logging
  UPDATE Reservierung_Log SET is_Erfolgreich=1 WHERE LogID=@letzte_reservation_ID;
END $$

DROP TRIGGER IF EXISTS `reservierung_ard`$$
CREATE TRIGGER `reservierung_ard`
  AFTER DELETE ON Reservierung
  FOR EACH ROW
BEGIN
  -- Logging
  UPDATE Reservierung_Log SET is_Erfolgreich=1 WHERE LogID=@letzte_reservation_ID;
END $$







DROP TRIGGER IF EXISTS `sitzplatz_bri`$$
CREATE TRIGGER `sitzplatz_bri`
  BEFORE INSERT ON Sitzplatz
  FOR EACH ROW
BEGIN
  IF NEW.Preis>100 THEN
    SIGNAL SQLSTATE '60030' SET MESSAGE_TEXT = 'Preis ist ungültig! Ein Sitzplatz darf maximal 100€ kosten.';
  END IF;
END $$

DROP TRIGGER IF EXISTS `sitzplatz_bru`$$
CREATE TRIGGER `sitzplatz_bru`
  BEFORE UPDATE ON Sitzplatz
  FOR EACH ROW
BEGIN
  IF NEW.Preis>100 THEN
    SIGNAL SQLSTATE '60031' SET MESSAGE_TEXT = 'Preis ist ungültig! Ein Sitzplatz darf maximal 100€ kosten.';
  END IF;
END $$






DROP TRIGGER IF EXISTS `nm_reservierung_sitzplatz_bri` $$
CREATE TRIGGER `nm_reservierung_sitzplatz_bri`
  BEFORE INSERT ON nm_Reservierung_Sitzplatz
  FOR EACH ROW
BEGIN
  IF EXISTS(
      SELECT fk_Sitzplatz_ID FROM nm_Reservierung_Sitzplatz nm
        JOIN Reservierung re ON nm.fk_Reservierung_ID = re.ID
        WHERE (re.fk_Vorstellung_ID=(SELECT r.fk_Vorstellung_ID FROM Reservierung r WHERE r.ID=NEW.fk_Reservierung_ID))
          AND fk_Sitzplatz_ID=NEW.fk_Sitzplatz_ID
  ) THEN
    SIGNAL SQLSTATE '60040' SET MESSAGE_TEXT = 'Sitzplatz ist für diese Vorstellung bereits reserviert!';
  END IF;
END $$

DROP TRIGGER IF EXISTS `nm_reservierung_sitzplatz_bru` $$
CREATE TRIGGER `nm_reservierung_sitzplatz_bru`
  BEFORE UPDATE ON nm_Reservierung_Sitzplatz
  FOR EACH ROW
BEGIN
  IF EXISTS(
      SELECT fk_Sitzplatz_ID FROM nm_Reservierung_Sitzplatz nm
        JOIN Reservierung re ON nm.fk_Reservierung_ID = re.ID
        WHERE (re.fk_Vorstellung_ID=(SELECT r.fk_Vorstellung_ID FROM Reservierung r WHERE r.ID=NEW.fk_Reservierung_ID))
          AND fk_Sitzplatz_ID=NEW.fk_Sitzplatz_ID
  ) THEN
    SIGNAL SQLSTATE '60041' SET MESSAGE_TEXT = 'Sitzplatz ist für diese Vorstellung bereits reserviert!';
  END IF;
END $$




DROP TRIGGER IF EXISTS `vorstellung_bri` $$
CREATE TRIGGER `vorstellung_bri`
  BEFORE INSERT ON Vorstellung
  FOR EACH ROW
BEGIN
  DECLARE v_saalname VARCHAR(50);
  DECLARE v_spieldauer INTEGER UNSIGNED;
  SELECT Saal.Name INTO v_saalname FROM Saal WHERE Saal.ID=NEW.fk_Saal_ID;
  SELECT Film.Spieldauer INTO v_spieldauer FROM Film WHERE Film.ID=NEW.fk_Film_ID;

  IF EXISTS(
      SELECT v_Vorstellung.Beginn, v_Vorstellung.Ende, v_Vorstellung.Saalname
        FROM v_Vorstellung
        WHERE v_saalname=Saalname
          AND NEW.Beginn<v_Vorstellung.Ende
          AND DATE_ADD(NEW.Beginn, INTERVAL v_spieldauer MINUTE)>v_Vorstellung.Beginn
  ) THEN
    SIGNAL SQLSTATE '60050' SET MESSAGE_TEXT = 'Vorstellung überschneidet sich mit anderen Vorstellungen in einem Saal!';
  END IF;
END $$

DROP TRIGGER IF EXISTS `vorstellung_bru` $$
CREATE TRIGGER `vorstellung_bru`
  BEFORE UPDATE ON Vorstellung
  FOR EACH ROW
BEGIN
  DECLARE v_saalname VARCHAR(50);
  DECLARE v_spieldauer INTEGER UNSIGNED;
  SELECT Saal.Name INTO v_saalname FROM Saal WHERE Saal.ID=NEW.fk_Saal_ID;
  SELECT Film.Spieldauer INTO v_spieldauer FROM Film WHERE Film.ID=NEW.fk_Film_ID;

  IF EXISTS(
      SELECT v_Vorstellung.Beginn, v_Vorstellung.Ende, v_Vorstellung.Saalname
        FROM v_Vorstellung
        WHERE v_saalname=Saalname
          AND NEW.Beginn<v_Vorstellung.Ende
          AND DATE_ADD(NEW.Beginn, INTERVAL v_spieldauer MINUTE)>v_Vorstellung.Beginn
          AND v_Vorstellung.ID <> OLD.ID
  ) THEN
    SIGNAL SQLSTATE '60050' SET MESSAGE_TEXT = 'Vorstellung überschneidet sich mit anderen Vorstellungen in einem Saal!';
  END IF;
END $$

DROP TRIGGER IF EXISTS `film_bru` $$
CREATE TRIGGER `film_bru`
  BEFORE UPDATE ON Film
  FOR EACH ROW
BEGIN
  DECLARE v_saalname VARCHAR(50);
  DECLARE v_beginn DATETIME;
  DECLARE vc_vorstellung_col, vc_vorstellung_done INT DEFAULT 0;
  DECLARE vc_vorstellung CURSOR FOR SELECT ID FROM Vorstellung WHERE fk_Film_ID=NEW.ID;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET vc_vorstellung_done = 1;

  if (NEW.Spieldauer > OLD.Spieldauer) THEN

    SET vc_vorstellung_done = 0;
    OPEN vc_vorstellung;
    FETCH vc_vorstellung INTO vc_vorstellung_col;

    WHILE NOT vc_vorstellung_done DO
      SELECT Saal.Name INTO v_saalname
        FROM Vorstellung
        JOIN Saal ON Vorstellung.fk_Saal_ID = Saal.ID
        WHERE Vorstellung.ID=vc_vorstellung_col;
      SELECT Vorstellung.Beginn INTO v_beginn
        FROM Vorstellung
        WHERE Vorstellung.ID=vc_vorstellung_col;
      IF EXISTS(
          SELECT v_Vorstellung.Beginn, v_Vorstellung.Ende, v_Vorstellung.Saalname
            FROM v_Vorstellung
            WHERE v_saalname=Saalname
              AND v_beginn<v_Vorstellung.Ende
              AND DATE_ADD(v_beginn, INTERVAL NEW.Spieldauer MINUTE)>v_Vorstellung.Beginn
              AND v_Vorstellung.ID <> vc_vorstellung_col
      ) THEN
        SIGNAL SQLSTATE '60050' SET MESSAGE_TEXT = 'Vorstellung überschneidet sich mit anderen Vorstellungen in einem Saal!';
      END IF;
      SET vc_vorstellung_done = 0;
      FETCH vc_vorstellung INTO vc_vorstellung_col;
    END WHILE;
    CLOSE vc_vorstellung;

  END IF;
END $$



DELIMITER ;