program chat;

type
strarr = array of string;



//permet de déterminer la taille du tableau qui recevra chaque mot
function tailleTableau (n : string) : integer;
var 
longueur, result, i : integer;

begin
longueur := length(n);
result := 1;

for i := 0 to (longueur-1) do
	begin
	if n[i] = ' ' then result := result + 1;
	end;

tailleTableau := result;
end;



//Permet de mettre chaque mot dans une case du tableau
function tablePhrase (n : string ; longueur : integer) : strarr ;
var
tableauPhrase : array of string;
maxLength : integer;
i, y : integer;

begin
SetLength(tableauPhrase, longueur);
maxLength := length(n);

for i := 0 to (longueur-1) do
	begin
	tableauPhrase[i] := ''; //initialise le tableau
	end;

y := 0;
i := 0;

repeat
	repeat
	tableauPhrase[i] := tableauPhrase[i] + n[y]; //concatene chaque lettre du mot dans la case
	y := y + 1;
	until (n[y] = ' ') or (y > maxLength); //jusqu'à la fin du mot ou de la phrase

	i := i + 1;
until (i > longueur);

tablePhrase := tableauPhrase;

end;
 
//*************************************************************************************************

//Donne un tableau avec les types (sujet, verbe) de chaque mot
function tableType (tableauPhrase : strarr ; longueur : integer) : strarr ;
var
i, y, lengthMot : integer;
tableauType, result : array of string;
mot, motLu, motDico : string;
f : text;
motTrouve : boolean;

begin
SetLength(tableauType, longueur);

i := 0;


for i := 0 to (longueur-1) do
	begin
	mot := tableauPhrase[i];
	motTrouve := false;

	Assign(f, 'dico.txt'); //ouvre le flux
	reset(f);
	while not eof(f) or motTrouve do //tant que le fichier n'est pas terminé
 		begin
 	     	readln(f, motLu); //on lit ligne par ligne

		y := 0;
		motDico := '';
		lengthMot := length(motLu);
		while (motLu[y] <> '/') and (y < lengthMot) do //on ne garde que le mot et pas son type
			begin
			motDico := motDico + motLu[y];
			y := y + 1;
			end;

		motTrouve := mot = motDico;//on compare
	   	end;     

	If motTrouve then tableauType[i] := motLu[(y+1)]
	Else tableauType[i] := 'Inconnu';

	close(f); //ferme le flux
	end;

result := tableauType;
end;

//*************************************************************************************************

function different (a, b : string) : boolean;
var
result : boolean; 

begin
result := a <> b;
end;


function trouverSujetReponse (tableauType, tableauPhrase : strarr ; longueur : integer) : string;
var
i : integer;
sujet, sujetReponse : string;

begin
i := 0;

sujet := '';

while different(tableauType[i], 'S') or (i > longueur) do
	begin
	i := i + 1;
	end;

sujet := tableauPhrase[i];

if sujet = 'je' then sujetReponse := 'tu'
else if sujet = 'tu' then sujetReponse := 'je'
else if sujet = 'il' then sujetReponse := 'il'
else if sujet = 'elle' then sujetReponse := 'elle'
else if sujet = 'nous' then sujetReponse := 'vous'
else if sujet = 'vous' then sujetReponse := 'nous'
else if sujet = 'ils' then sujetReponse := 'ils'
else if sujet = 'elles' then sujetReponse := 'elles'
else sujetReponse := 'tu';
end;

//*************************************************************************************************


procedure apprendre (motInconnu : string);
var
f : text;
i : integer;
motLu, contexte : string;

begin
writeln('Chatbot : Je ne connais pas ce mot. Pouvez-vous le rattachez à une des catégories suivantes ?');

Assign(f, 'contexte.txt'); //ouvre le flux
	reset(f);
	while not eof(f) do //tant que le fichier n'est pas terminé
 		begin
 	     	readln(f, motLu); //on lit ligne par ligne
		writeln(motLu);
	   	end;     
	close(f); //ferme le flux

writeln('Chatbot : Si oui, merci d''entrer le nom de la catégorie.');
readln(contexte);

motLu := '';

Assign(f, 'contexteDico.txt'); //ouvre le flux
	reset(f);
	while not eof(f) or (motLu = ('/' + contexte)) do //tant que le fichier n'est pas terminé
 		begin
 	     	readln(f, motLu); //on lit ligne par ligne
	   	end;

	writeln(#10 + contexte);
	close(f); //ferme le flux

end;



//*************************************************************************************************

// Corps du programme
var
	n : string;
	pseudonyme : string;
	longueur : integer;

begin
	write('Entrez votre pseudonyme : ');
	readln(pseudonyme);

	repeat
		write(pseudonyme, ' : ');
		readln(n);
		longueur :=  tailleTableau(n);
		tablePhrase(n, longueur);
	until n = 'quitter';
end.
