\.
--TRUNCATE TABLE "Vente";
--TRUNCATE TABLE "Panier";
DROP PROCEDURE insertVente IF EXISTS CASCADE;
CREATE PROCEDURE insertVente
  ( IN venteDate DATE
  , IN venteClient INTEGER
  , IN venteProduit INTEGER
  , IN venteQuantité DECIMAL
  )
  MODIFIES SQL DATA
  BEGIN ATOMIC
    DECLARE panierID INTEGER DEFAULT NULL;
    DECLARE venteID INTEGER DEFAULT NULL;

    -- CorrectnessNote: seule la date et le client
    -- font partie des critères pour décider
    -- si le panier existe déjà où non.
    SET panierID = SELECT ID FROM "Panier"
                             WHERE "Panier".date = venteDate
                             AND   "Panier".client = venteClient;
    IF panierID IS NULL
    THEN
      INSERT INTO "Panier"(date, client)
             VALUES (venteDate, venteClient);
      SET panierID = IDENTITY();
    END IF;

    -- CorrectnessNote: la quantité ne fait pas partie des critères
    -- pour décider si la vente existe déjà ou non.
    SET venteID = SELECT ID FROM "Vente"
                            WHERE "Vente".panier = panierID
                            AND   "Vente".produit = venteProduit;
    IF venteID IS NULL
    THEN
      INSERT INTO "Vente"(panier, produit, quantité)
             VALUES (panierID, venteProduit, venteQuantité);
    END IF;
  END
.;

DROP PROCEDURE insertVentesParAbonnement IF EXISTS;
CREATE PROCEDURE insertVentesParAbonnement(IN finalDate DATE)
  MODIFIES SQL DATA
  BEGIN ATOMIC
    -- ExplanationNote: gère chaque jour l'un après l'autre.
    for_days:
    FOR SELECT day
      FROM UNNEST (SEQUENCE_ARRAY(DATE '2025-04-07', finalDate, 1 DAY))
             WITH ORDINALITY as T(day, I)
    DO
      -- ExplanationNote: pour un jour donné,
      -- gère chaque abonnement l'un après l'autre.
      for_abos:
      FOR SELECT ID as aboID
               , client as aboClient
               , produit as aboProduit
               , quantité as aboQuantité
               , période as aboP
            FROM "Abonnement"
            JOIN "Période" ON "Période".ID = "Abonnement".période
                   AND "Période".nom = DAYNAME(day)
      DO
        CALL insertVente(day, aboClient, aboProduit, aboQuantité);
      END FOR for_abos;
    END FOR for_days;
  END;
.;

CALL insertVentesParAbonnement(DATE '2025-04-07' + 7 DAY);

\i sql/show.sql

--call prix_à_date(CURRENT_DATE);
select "Prod".nom_complet, date, euros
from table (prix_à_date(CURRENT_DATE)) as PD
join table (choisirUnProduit()) as "Prod" ON "Prod".ID = produit
;
