SET FOREIGN_KEY_CHECKS = 0;
SET @DIS_TRIGGER = 1;
SET AUTOCOMMIT = 0;

DELETE FROM Studente;
DELETE FROM corso;
DELETE FROM corsononprogettuale;
DELETE FROM corsoprogettuale;
DELETE FROM esame;
DELETE FROM relazionefinale;
DELETE FROM argomento;
DELETE FROM discussione;
DELETE FROM prevede;
DELETE FROM pianodistudio;
DELETE FROM corso;


-- popolo studente

DROP PROCEDURE IF EXISTS `popolamentoStudenti`;

DELIMITER $$

CREATE PROCEDURE `popolamentoStudenti`(IN numeroStudenti INT)
BEGIN 
DECLARE tempVar INT;
SET tempVar = numeroStudenti;
WHILE tempVar > 0 DO
	INSERT INTO Studente VALUES(tempVar);
	SET tempVar = tempVar -1;
END WHILE;
END $$

DELIMITER ;

-- popolo pianodistudio

DROP FUNCTION IF EXISTS `SciegliPiano`;

DELIMITER $$

CREATE FUNCTION `SciegliPiano`(matricola_studente INT(15)) RETURNS VARCHAR(100)
BEGIN
DECLARE resultTemp VARCHAR(100);
SET resultTemp = MOD(matricola_studente, 2);
IF resultTemp = 0 THEN
	SET resultTemp = 'PLM';
ELSE SET resultTemp = 'Sistemi Informatici';
END IF;
RETURN resultTemp;
END $$

DELIMITER ;

DELETE FROM pianodistudio;

DROP PROCEDURE IF EXISTS `popolamentoPianodistudio`;

DELIMITER $$

CREATE PROCEDURE `popolamentoPianodistudio`()
BEGIN
DECLARE stop boolean DEFAULT 0;
DECLARE campoPianodiStudio INT(15);
DECLARE campoTipo VARCHAR(100);
DECLARE cursoreStudenti CURSOR FOR SELECT matricola FROM studente;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stop = 1;

OPEN cursoreStudenti;
FETCH cursoreStudenti INTO campoPianodiStudio;

WHILE NOT stop DO
	SET campoTipo = SciegliPiano(campoPianodiStudio);
	INSERT INTO pianodistudio VALUES(campoPianodiStudio,campoTipo);
	FETCH cursoreStudenti INTO campoPianodiStudio;
END WHILE;
CLOSE cursoreStudenti;
END $$

DELIMITER ;

-- popolo corso. Assuzione semplificativa: i corsi sono tutti di 6 crediti in questo script di popolamento semiautomatico

DROP PROCEDURE IF EXISTS `popolamentoCorso`;

DELIMITER $$

CREATE PROCEDURE `popolamentoCorso`()
BEGIN
DECLARE stop boolean DEFAULT 0;
DECLARE variabileTuttiCorsi varchar(100);
DECLARE cursoreTuttiICorsi CURSOR FOR SELECT nome FROM corsononprogettuale UNION SELECT nome FROM corsoprogettuale;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stop = 1;

OPEN cursoreTuttiICorsi;
FETCH cursoreTuttiICorsi INTO variabileTuttiCorsi;

WHILE NOT stop DO
	INSERT INTO corso VALUES(variabileTuttiCorsi,6);
	FETCH cursoreTuttiICorsi INTO variabileTuttiCorsi;
END WHILE;
CLOSE cursoreTuttiICorsi;

END $$

DELIMITER ;

COMMIT;

-- inizio a popolare.

SET @corsoNonProgettuale1 = 'Analisi';
SET @corsoNonProgettuale2 = 'Geometria';
INSERT INTO corsononprogettuale VALUES(@corsoNonProgettuale1),(@corsoNonProgettuale2); -- creazione dei corsi non progettuali
SET @corsoProgettuale1 = 'Progetto di Applicazioni Software';
SET @corsoProgettuale2 = 'Progetto di Reti di Calcolatori e Sistemi Informatici';
INSERT INTO corsoprogettuale VALUES(@corsoProgettuale1 ),(@corsoProgettuale2); -- creazione dei corsi progettuali
CALL popolamentoCorso(); -- creazione della tabella corso, ottenuta dall'unione delle tabelle corsononprogettuale e corsoprogettuale.

SET @megaEsame168 = 'MegaEsame168';
SET @megaEsame162 = 'MegaEsame162';
INSERT INTO corso VALUES(@megaEsame168,174-6); -- creo un esame che in un colpo solo mi completa un piano da studi incompleto, contenente 6 crediti
INSERT INTO corsoNonProgettuale VALUES(@megaEsame168);
INSERT INTO corso VALUES(@megaEsame162,174-6-6); -- creo un esame che in un colpo solo mi completa un piano da studi incompleto, contenente 12 crediti
INSERT INTO corsoNonProgettuale VALUES(@megaEsame162);

CALL popolamentoStudenti(5); -- creazione di 5 studenti con matricole 1,2,3,4,5
CALL popolamentoPianodistudio(); -- creazione dei piani di studio relativi agli studenti creati sopra. In questo script semiautomatico, gli studenti con matricola pari hanno un piano di studio PLM, quelli dispari un piano di studio di tipo Sistemi Informatici

-- inizio la definizione dei piani di studio degli studenti
INSERT INTO prevede VALUES(1,@corsoNonProgettuale1),(2,@corsoNonProgettuale2),(3,@corsoProgettuale1),(4, @corsoProgettuale1), (5,@corsoProgettuale2);
INSERT INTO prevede VALUES(2,@corsoProgettuale1);
-- ora completo i piani in modo che raggiungano 174 crediti
INSERT INTO prevede VALUES(2,@megaEsame162);
INSERT INTO prevede VALUES(1,@megaEsame168),(3,@megaEsame168),(4,@megaEsame168),(5,@megaEsame168);
-- fine definzione dei piani di studio

SET @sessioneDiLaurea1 = DATE_ADD(CURRENT_DATE(), INTERVAL 20 DAY); -- fisso una data per una sessione di laurea

INSERT INTO sessionedilaurea VALUES (@sessioneDiLaurea1);

INSERT INTO discussione VALUES(1,@sessioneDiLaurea1,90); -- lo studente 1 (Sistemi Informatici) si è laureato
INSERT INTO relazionefinale VALUES(1,100);
INSERT INTO argomento VALUES (1,@corsoNonProgettuale2);
INSERT INTO esame VALUES (1,@corsoNonProgettuale1,20,DATE_SUB(CURRENT_DATE(), INTERVAL 120 DAY));
INSERT INTO esame VALUES (1,@corsoNonProgettuale2,18,DATE_SUB(CURRENT_DATE(), INTERVAL 125 DAY));
INSERT INTO esame VALUES (1,@megaEsame168,28,DATE_SUB(CURRENT_DATE(), INTERVAL 225 DAY));

INSERT INTO discussione VALUES(2,@sessioneDiLaurea1,106); -- lo studente 2 (PLM) si è laureato
INSERT INTO relazionefinale VALUES(2,120);
INSERT INTO argomento VALUES (2,@corsoProgettuale2);
INSERT INTO esame VALUES (2,@corsoProgettuale1,27,DATE_SUB(CURRENT_DATE(), INTERVAL 120 DAY));
INSERT INTO esame VALUES (2,@corsoNonProgettuale2,25,DATE_SUB(CURRENT_DATE(), INTERVAL 180 DAY));
INSERT INTO esame VALUES (2,@megaEsame162,28,DATE_SUB(CURRENT_DATE(), INTERVAL 265 DAY));

INSERT INTO esame VALUES (3,@corsoProgettuale1,26,DATE_SUB(CURRENT_DATE(), INTERVAL 150 DAY));
INSERT INTO esame VALUES (4,@corsoProgettuale2,23,DATE_SUB(CURRENT_DATE(), INTERVAL 220 DAY));

INSERT INTO relazionefinale VALUES (3,200); -- lo studente 3 non ha ancora discusso la sua tesi di laurea
INSERT INTO argomento VALUES(3,@corsoNonProgettuale1);

SET AUTOCOMMIT = 1;
SET FOREIGN_KEY_CHECKS = 1;
SET @DIS_TRIGGER = NULL;

