-- Fonction appelee par l'utilisateur
-- pour creer un nombre de vins maximal 
-- = n recoltants x n appelations x n types de vins

CREATE OR REPLACE FUNCTION peuple_vin() RETURNS bigint as
$$
DECLARE
	v_recoltant_id integer;
	v_appellation_id integer;
	v_type_vin_id integer;
	recoltants integer;
	appellations integer;
	types_vins integer;
	tuples_a_generer integer;
	compteur bigint :=0;
BEGIN

  -- vider la table de stock, qui depend de vin, puis vin
  delete from stock;
  delete from vin;

  -- compter le nombre de recoltants
  select count(*) from recoltant into recoltants;

  -- compter le nombre d'appellations
  select count(*) from appellation into appellations;

  -- compter le nombre de types de vins
  select count(*) from type_vin into types_vins;

  -- calculer le nombre de combinaisons possibles
  select (recoltants*appellations*types_vins) into tuples_a_generer;

  --on boucle sur tous les recoltants
  for v_recoltant_id in 1 .. recoltants loop

    -- on boucle sur les appelations
    for v_appellation_id in 1 .. appellations loop
  
       -- on boucle sur les types de vins
      for v_type_vin_id in 1 .. types_vins loop
  
        -- insertion dans la table de vin
        insert into vin (recoltant_id, appellation_id, type_vin_id)
        values (v_recoltant_id, v_appellation_id, v_type_vin_id);

        if (((compteur%1000)=0) or (compteur=tuples_a_generer)) then
          raise notice 'vins : % sur % tuples generes', compteur, tuples_a_generer;
        end if;
  
        compteur := compteur + 1;
   
      end loop; --fin boucle type vin
  
    end loop; -- fin boucle appellations

  end loop; --fin boucle recoltants

  RETURN compteur;
END;
$$ LANGUAGE plpgsql;
