//Exo 1 :
CREATE OR REPLACE FUNCTION fn_points_fidelite(client_id INT)
RETURN INT
IS va_total_point INT;
BEGIN
    SELECT (SUM(prix_total)/10) INTO va_total_point
    FROM ligne_commande lc JOIN commande3 c ON c.id = lc.commande_id
    WHERE
        c.client_id = client_id;
RETURN ROUND(va_total_point);
EXCEPTION
    WHEN NO_DATA_FOUND 
    THEN DBMS_OUTPUT.PUT_LINE('Aucune commande');
END;

DECLARE CURSOR c_points_fidelite IS
    SELECT nom, id
    FROM client
    WHERE client.client_id = :client_id;

    v_nom client.nom%TYPE;
    v_id client.id%TYPE;
BEGIN
  OPEN c_points_fidelite;
  LOOP
    FETCH c_points_fidelite INTO v_nom, v_id;
    DBMS_OUTPUT.PUTLINE((v_nom||"a"||fn_point_fidelite(v_id)||"points de fidélité"),
    EXIT WHEN c_points_fidelite % NOT FOUND;
  END LOOP;
  CLOSE c_points_fidelite;
END;
/

//Exo 2 :
CREATE OR REPLACE TRIGGER trg_DeleteCommande3
BEFORE DELETE 
ON Commande3
FOR EACH ROW
BEGIN
    DELETE FROM ligne_commande
    WHERE commande_id = :OLD.id;
END;

//Exo 3 :

CREATE OR REPLACE TRIGGER trg_DeleteClient
BEFORE DELETE ON client
FOR EACH ROW
BEGIN
    DELETE FROM Commande3
    WHERE client_id = :OLD.id;
    
    DELETE FROM ligne_commande
    WHERE commande_id IN (SELECT id FROM Commande3 WHERE client_id = :OLD.id);
END;

//Exo 4 :

CREATE TABLE Client_His (
    id INT PRIMARY KEY,
    prenom VARCHAR(50),
    nom VARCHAR(50),
    email VARCHAR(100),
    ville VARCHAR(50),
    date_suppression DATE DEFAULT SYSDATE
);

CREATE OR REPLACE TRIGGER trg_DeleteClient
BEFORE DELETE ON client
FOR EACH ROW
BEGIN
    INSERT INTO Client_His (id, prenom, nom, email, ville, date_suppression)
    VALUES (:OLD.id, :OLD.prenom, :OLD.nom, :OLD.email, :OLD.ville, SYSDATE);
    
    DELETE FROM Commande3 WHERE client_id = :OLD.id;

    DELETE FROM ligne_commande WHERE commande_id IN (SELECT id FROM Commande3 WHERE client_id = :OLD.id);
END;

//Exo 5 :
//Exo 2

//1/
BEGIN TRANSACTION;

DELETE FROM ligne_commande WHERE commande_id = :commande_id;

DELETE FROM Commande3 WHERE id = :commande_id;

COMMIT;

//2/
ALTER TABLE ligne_commande
ADD CONSTRAINT fk_ligne_commande_commande
FOREIGN KEY (commande_id)
REFERENCES Commande3(id)
ON DELETE CASCADE;

//3/
CREATE PROCEDURE SupprimerCommande (p_commande_id INT) AS
BEGIN
    DELETE FROM ligne_commande WHERE commande_id = p_commande_id;
    DELETE FROM Commande3 WHERE id = p_commande_id;
END;


//Exo 6 :

DROP TABLE ligne_commande;
DROP TABLE Commande3;
DROP TABLE Client;
DROP TABLE Client_His;


CREATE TABLE Client (
    id INT PRIMARY KEY,
    prenom VARCHAR(50),
    nom VARCHAR(50),
    email VARCHAR(100),
    ville VARCHAR(50)
);


CREATE TABLE Client_His (
    id INT PRIMARY KEY,
    prenom VARCHAR(50),
    nom VARCHAR(50),
    email VARCHAR(100),
    ville VARCHAR(50),
    date_suppression DATE DEFAULT SYSDATE
);


CREATE TABLE Commande3 (
    id INT PRIMARY KEY,
    client_id INT,
    date_achat DATE,
    reference VARCHAR(50),
    FOREIGN KEY (client_id) REFERENCES Client(id) ON DELETE CASCADE
);

CREATE TABLE ligne_commande (
    id INT PRIMARY KEY,
    commande_id INT,
    produit_id INT,
    quantite INT,
    prix_total DECIMAL(10,2),
    FOREIGN KEY (commande_id) REFERENCES Commande3(id) ON DELETE CASCADE
);


//Exo 7 :

CREATE TABLE CommandeAuditLog (
    Utilisateur VARCHAR(50),
    ActionSQL VARCHAR(3),
    DateMAJ DATE DEFAULT SYSDATE,
    ActCol VARCHAR(255)
);

CREATE OR REPLACE TRIGGER trg_AuditInsertCommande
AFTER INSERT ON Commande
FOR EACH ROW
BEGIN
    INSERT INTO CommandeAuditLog (Utilisateur, ActionSQL, DateMAJ, ActCol)
    VALUES (USER, 'INS', SYSDATE, 'N/A');
END;

CREATE OR REPLACE TRIGGER trg_AuditDeleteCommande
AFTER DELETE ON Commande
FOR EACH ROW
BEGIN
    INSERT INTO CommandeAuditLog (Utilisateur, ActionSQL, DateMAJ, ActCol)
    VALUES (USER, 'DEL', SYSDATE, 'N/A');
END;

CREATE OR REPLACE TRIGGER trg_AfterUpdateCommande3
AFTER UPDATE ON Commande3
FOR EACH ROW
BEGIN

    DECLARE
        modified_columns VARCHAR2(255);
    BEGIN

        modified_columns := '';

        IF :OLD.date_achat != :NEW.date_achat THEN
            modified_columns := modified_columns || 'date_achat, ';
        END IF;

        IF :OLD.reference != :NEW.reference THEN
            modified_columns := modified_columns || 'reference, ';
        END IF;

        modified_columns := RTRIM(modified_columns, ', ');

        INSERT INTO CommandeAuditLog (Utilisateur, ActionSQL, DateMAJ, ActCol)
        VALUES (USER, 'UPD', SYSDATE, modified_columns);
    END;
END;


