CREATE SCHEMA HotelBis;
SET search_path TO HotelBis, public;
-- Les entités
CREATE TABLE HotelBis.Client (
  idClient serial NOT NULL,
  nom text NOT NULL,
  prenom text NOT NULL,
  mail text NOT NULL, -- en attendant un type email -- type citext (sase insensitive text)
  password text NOT NULL,
  -- clefs candidates
  PRIMARY KEY (idClient),
  UNIQUE (mail)
);
CREATE TABLE HotelBis.Chambre (
  idChambre serial NOT NULL,
  tarif integer NOT NULL CHECK (tarif > 0),
  -- clefs candidates
  PRIMARY KEY (idChambre)
);
CREATE TABLE HotelBis.Bar (
  boisson text NOT NULL,
  prix integer NOT NULL CHECK (prix > 0),
  -- clefs candidates
  PRIMARY KEY (boisson)
);
-- Les associations
CREATE TABLE HotelBis.Reservation (
  idReservation serial NOT NULL,
  idClient serial NOT NULL,
  idChambre serial NOT NULL,
  date_debut date NOT NULL,
  date_fin date NOT NULL,
  -- clefs candidates
  PRIMARY KEY (idReservation),
  UNIQUE (idChambre, date_debut),
  UNIQUE (idChambre, date_fin),
  -- Clefs étrangères
  FOREIGN KEY (idClient) REFERENCES HotelBis.Client(idClient),
  FOREIGN KEY (idChambre) REFERENCES HotelBis.Chambre(idChambre),
  -- Contrainte intégrité élémentaire
  CHECK (date_debut < date_fin)
);
CREATE TABLE HotelBis.Recette (
  idReservation serial NOT NULL,
  date_heure timestamp NOT NULL, -- jour et heure reservation ou bien consommation
  intitule text NOT NULL, -- chambre ou boisson
  quantite integer NOT NULL CHECK (quantite > 0), -- nombre nuits ou nb boissons
  prix_unitaire integer NOT NULL, -- recopie pour permettre des changements de tarif.
  -- clefs candidates
  PRIMARY KEY (idReservation, date_heure, intitule),
  -- Clefs étrangères
  FOREIGN KEY (idReservation) REFERENCES HotelBis.Reservation(idReservation) ON DELETE CASCADE
);
CREATE TABLE HotelBis.Facture (
  -- choix d'une bijection entre idFacture et idReservation   
  idFacture serial NOT NULL,
  idReservation serial NOT NULL,
  jour date NOT NULL, -- jour de l'édition et du reglement de la facture
  total integer NOT NULL CHECK (total > 0), -- somme calculée
  -- clefs candidates
  PRIMARY KEY (idFacture),
  UNIQUE (idFacture),
  -- Clefs étrangères
  FOREIGN KEY (idReservation) REFERENCES HotelBis.Reservation(idReservation)
);
