DELIMITER $$

-- Reservierung-Package

DROP FUNCTION IF EXISTS res_priv_search_vorstellung$$
CREATE FUNCTION res_priv_search_vorstellung (p_saalname VARCHAR(50), p_beginn DATETIME)
  RETURNS INTEGER UNSIGNED
BEGIN
  DECLARE res INTEGER UNSIGNED;
  DECLARE EXIT HANDLER FOR 1172 BEGIN
      SIGNAL SQLSTATE '50200' SET MESSAGE_TEXT = 'Mehr als eine Vorstellung gefunden!';
  END;

  SELECT Vorstellung.ID INTO res FROM Vorstellung WHERE Vorstellung.fk_Saal_ID=saal_pub_search_saal(p_saalname) AND Vorstellung.Beginn=p_beginn;

  IF res IS NULL THEN
    SIGNAL SQLSTATE '50201' SET MESSAGE_TEXT = 'Keine Vorstellung gefunden!';
  END IF;
  RETURN res;
END $$

DROP FUNCTION IF EXISTS res_pub_chk_mail$$
CREATE FUNCTION res_pub_chk_mail(p_mail VARCHAR(255))
  RETURNS BIT
BEGIN
   if EXISTS(select 1 from (SELECT p_mail Mail) t where t.Mail REGEXP '^[a-zA-Z0-9][a-zA-Z0-9._-]*@[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a‌​-zA-Z]{2,4}$')
   then
      return 1;
   else
      return 0;
   end if;
END $$

DROP FUNCTION IF EXISTS `res_pub_reservieren`$$
CREATE FUNCTION `res_pub_reservieren` (
  p_vorstellung_saalname VARCHAR(50),
  p_vorstellung_beginn DATETIME,
  p_vorname VARCHAR(255),
  p_nachname VARCHAR(255),
  p_mail VARCHAR(255),
  p_reihe INTEGER UNSIGNED,
  p_platz INTEGER UNSIGNED
)
  RETURNS INTEGER UNSIGNED
BEGIN
  DECLARE v_reservierungID INTEGER UNSIGNED DEFAULT NULL;

  INSERT INTO Reservierung (Vorname, Nachname, Mail, fk_Vorstellung_ID) VALUES
    (p_vorname, p_nachname, p_mail, res_priv_search_vorstellung(p_vorstellung_saalname, p_vorstellung_beginn))
  ;
  SET v_reservierungID = LAST_INSERT_ID();

  INSERT INTO nm_Reservierung_Sitzplatz (fk_Reservierung_ID, fk_Sitzplatz_ID) VALUES
    (v_reservierungID, saal_pub_search_sitzplatz(p_vorstellung_saalname, p_reihe, p_platz))
  ;
  RETURN v_reservierungID;
END $$


DROP PROCEDURE IF EXISTS `res_pub_add_reservieren_sitz`$$
CREATE PROCEDURE `res_pub_add_reservieren_sitz` (
  p_reservierungID INTEGER UNSIGNED,
  p_reihe INTEGER UNSIGNED,
  p_platz INTEGER UNSIGNED
)
BEGIN
  DECLARE v_saalID INTEGER UNSIGNED DEFAULT 0;

  IF (p_reservierungID IS NULL) THEN
    SIGNAL SQLSTATE '50210' SET MESSAGE_TEXT = 'Reservierungs-ID darf nicht NULL sein!';
  END IF;

  SELECT Vorstellung.fk_Saal_ID INTO v_saalID FROM Reservierung
    JOIN Vorstellung ON Reservierung.fk_Vorstellung_ID = Vorstellung.ID
    WHERE Reservierung.ID=p_reservierungID
  ;

  INSERT INTO nm_Reservierung_Sitzplatz (fk_Reservierung_ID, fk_Sitzplatz_ID) VALUES
    (p_reservierungID, saal_pub_search_sitzplatz_saalID(v_saalID, p_reihe, p_platz))
  ;
END $$




DELIMITER ;