--On supprime les séquences si elles ont été créées auparavant
DROP SEQUENCE seq_id_producteur;
DROP SEQUENCE seq_id_vin;

DROP TRIGGER trig_id_producteur;
DROP TRIGGER trig_id_vin;
DROP TRIGGER trig_quantite_insert;
DROP TRIGGER trig_quantite_update;
DROP TRIGGER trig_quantite_delete;
DROP FUNCTION recupererLeVin;

-----------------------------------SEQUENCE------------------------------------

--On crée les séquences
CREATE SEQUENCE seq_id_producteur START WITH 1;
CREATE SEQUENCE seq_id_vin START WITH 1;

----------------------------------TRIGGER----------------------------------------

CREATE OR REPLACE TRIGGER trig_id_producteur
BEFORE INSERT ON Producteur
FOR EACH ROW
DECLARE
  v_id_producteur NUMBER;
BEGIN
  SELECT seq_id_producteur.nextval INTO v_id_producteur FROM DUAL;
  :new.numprod := v_id_producteur;
END;
/

CREATE OR REPLACE TRIGGER trig_id_vin
BEFORE INSERT ON Vin
FOR EACH ROW
DECLARE
  v_id_vin NUMBER;
BEGIN
  SELECT seq_id_vin.nextval INTO v_id_vin FROM DUAL;
  :new.numvin := v_id_vin;
END;
/

CREATE OR REPLACE TRIGGER trig_quantite_insert
AFTER INSERT ON Recolte
FOR EACH ROW
BEGIN
UPDATE Producteur SET qtetot = qtetot + :new.quantite WHERE numprod = :new.numprod;
END;
/

CREATE OR REPLACE TRIGGER trig_quantite_update
AFTER UPDATE ON Recolte
FOR EACH ROW
BEGIN
UPDATE Producteur SET qtetot = qtetot + :new.quantite - :old.quantite WHERE numprod = :new.numprod;
END;
/

CREATE OR REPLACE TRIGGER trig_quantite_delete
AFTER DELETE ON Recolte
FOR EACH ROW
BEGIN
UPDATE Producteur SET qtetot = qtetot - :old.quantite WHERE numprod = :old.numprod;
END;
/

-------------------------------PROCEDURE--------------------------------------


-- Cette procedure permet l'ajout d'un producteur
CREATE OR REPLACE
PROCEDURE creerProducteur(nom_producteur VARCHAR,prenom_producteur VARCHAR,region_producteur VARCHAR, qtetot_producteur NUMBER)
IS
  nombre NUMBER;
BEGIN
  -- Verification que le nom d'utilisateur n'est pas nul
  IF nom_producteur IS NULL THEN
    dbms_output.put_line('nom producteur null');
  ELSE
    -- Ce bloc permet de verifier qu'aucune autre personne présente dans la table ne possede deja ce nom de producteur
    -- Utilisation du count, on stocke le resultat de la requête dans la variable nombre
    BEGIN
      SELECT COUNT(nom_producteur) INTO nombre FROM Producteur WHERE nom = nom_producteur;
    EXCEPTION
      -- Gestion des exceptions
      -- Si la requête ne trouve aucun résultat cela signifie que le nom du producteur n'est pas utilisé
      WHEN NO_DATA_FOUND THEN
	-- on instancit la variable nombre à 0
        nombre := 0;
	--la procedure s'arrête et affiche un message d'erreur
        dbms_output.put_line('table personne vide');
      WHEN OTHERS THEN
        dbms_output.put_line('autres personnes');
    END;

    -- On verifie donc que aucun utilisateur ne possède déjà ce nom d'utilisateur
    IF nombre = 0 THEN
      -- Si tel est le cas, on insère la nouvelle personne dans la table personne
      INSERT INTO Producteur(nom,prenom,region,qtetot) VALUES (nom_producteur, prenom_producteur, region_producteur, qtetot_producteur);
    ELSE
      -- On notifie que le login existe deja si la requete concernant le nombre est différente de 0
      dbms_output.put_line('ce login existe déjà!');
    END IF;
  END IF;
END creerProducteur;
/

-- Cette procedure permet l'ajout d'un vin
CREATE OR REPLACE
PROCEDURE creerVin(cru_vin VARCHAR,annee_vin NUMBER,degre_vin NUMBER)
IS
  nombre NUMBER;
BEGIN
  -- Verification que le nom d'utilisateur n'est pas nul
  IF cru_vin IS NULL THEN
    dbms_output.put_line('cru_vin null');
  ELSE
    -- Ce bloc permet de verifier qu'aucune autre personne présente dans la table ne possede deja ce nom de producteur
    -- Utilisation du count, on stocke le resultat de la requête dans la variable nombre
    BEGIN
      SELECT COUNT(cru_vin) INTO nombre FROM Vin WHERE cru = cru_vin;
    EXCEPTION
      -- Gestion des exceptions
      -- Si la requête ne trouve aucun résultat cela signifie que le nom du producteur n'est pas utilisé
      WHEN NO_DATA_FOUND THEN
	-- on instancit la variable nombre à 0
        nombre := 0;
	--la procedure s'arrête et affiche un message d'erreur
        dbms_output.put_line('table personne vide');

      WHEN OTHERS THEN
        dbms_output.put_line('autres personnes');
    END;

    -- On verifie donc que aucun utilisateur ne possède déjà ce nom d'utilisateur
    IF nombre = 0 THEN
      -- Si tel est le cas, on insère la nouvelle personne dans la table personne
      INSERT INTO Vin(cru,annee,degre) VALUES (cru_vin, annee_vin, degre_vin);
    ELSE
      -- On notifie que le login existe deja si la requete concernant le nombre est différente de 0
      dbms_output.put_line('ce login existe déjà!');
    END IF;
  END IF;
END creerVin;
/

-- Cette procedure permet l'ajout d'un producteur
CREATE OR REPLACE
PROCEDURE creerRecolte(numvin_recolte INTEGER, numprod_recolte INTEGER, quantite_recolte NUMBER)
IS
  nombre NUMBER;
BEGIN
  -- Verification que le nom d'utilisateur n'est pas nul
  IF numvin_recolte IS NULL THEN
    dbms_output.put_line('numvin_recolte null');
  ELSE
	IF numprod_recolte IS NULL THEN
		dbms_output.put_line('numprod_recolte null');
	ELSE
	    -- Ce bloc permet de verifier qu'aucune autre personne présente dans la table ne possede deja ce nom de producteur
	    -- Utilisation du count, on stocke le resultat de la requête dans la variable nombre
	    BEGIN
	      SELECT COUNT(quantite_recolte) INTO nombre FROM Recolte WHERE (numvin = numvin_recolte) AND (numprod = numprod_recolte) AND (quantite = quantite_recolte);
	    EXCEPTION
	      -- Gestion des exceptions
	      -- Si la requête ne trouve aucun résultat cela signifie que le nom du producteur n'est pas utilisé
	      WHEN NO_DATA_FOUND THEN
		-- on instancit la variable nombre à 0
		nombre := 0;
		--la procedure s'arrête et affiche un message d'erreur
		dbms_output.put_line('table personne vide');
	      WHEN OTHERS THEN
		dbms_output.put_line('autres personnes');
	    END;

	    -- On verifie donc que aucun utilisateur ne possède déjà ce nom d'utilisateur
	    IF nombre = 0 THEN
	      -- Si tel est le cas, on insère la nouvelle personne dans la table personne
	      INSERT INTO Recolte(numvin,numprod,quantite) VALUES (numvin_recolte, numprod_recolte, quantite_recolte);
	    ELSE
	      -- On notifie que le login existe deja si la requete concernant le nombre est différente de 0
	      dbms_output.put_line('ce login existe déjà!');
	END IF;
    END IF;
  END IF;
END creerRecolte;
/

-- Cette procedure permet l'ajout d'un producteur
CREATE OR REPLACE
PROCEDURE recupererLeVin(numvin_vin INTEGER, cru_vin VARCHAR, annee_vin NUMBER, degre_vin NUMBER)
IS
cru_vin VARCHAR(10);
annee_vin NUMBER(4);
degre_vin NUMBER(4,1);

BEGIN
  -- Verification que le nom d'utilisateur n'est pas nul
  IF numvin_vin IS NULL THEN
    dbms_output.put_line('numvin_vin null');
  ELSE
	BEGIN
	      SELECT cru, annee, degre INTO cru_vin, annee_vin, degre_vin FROM Vin WHERE (numvin = numvin_vin);
	    EXCEPTION
	      -- Gestion des exceptions
	      -- Si la requête ne trouve aucun résultat cela signifie que le nom du producteur n'est pas utilisé
	      WHEN NO_DATA_FOUND THEN
		--la procedure s'arrête et affiche un message d'erreur
		dbms_output.put_line('table vin vide');
	      WHEN OTHERS THEN
		dbms_output.put_line('autres personnes');
	END;
  END IF;
END recupererLeVin;
/
