MODULE printlist INTERFACE;

{*
	Este módulo proporciona el procedimiento para imprimir la lista de
	alumnos en la salida estándar.
*}

export printlist = (printOrdered);

IMPORT
	
	filesystem;
	
{*
	Imprime una lista con los alumnos del array link^. printMarks indica
	si se deben imprimir las notas de alguna convocatoria (0 para 
	Febrero/Junio, 1 para Septiembre, 2 para Diciembre y < 0 para
	no imprimir las notas).
*}
procedure printOrdered(link:PtrToDump; printMarks:integer);

{*
	Detiene la impresión de la lista y pide introducción de texto
	por parte del usuario mediante la entrada estándar. Devuelve true
	si el usuario ha introducido una q/Q o false en caso contrario.
*}
function stop:boolean;

END.

MODULE printlist IMPLEMENTATION;

IMPORT
	
	standardoutput;
	display;
	filteredinput;
	
CONST
	
	{*
		Máximo número de líneas a imprimir sin llamar a stop.
	*}
	MAX_LINES		= 15;
	{*
		Pesos de las notas práctica y teórica a la hora de calcular
		la global, mediante una media ponderada.
	*}
	WEIGHT_PRACTICE	= 2;
	WEIGHT_THEORY	= 8;
	
procedure printOrdered;
var
	
	c, i:integer value 0;
	foo:char;
	margin:integer value 15;
	pause, quit:boolean;
	temp:real;
	
begin
	
	clearDisplay;
	
	case printMarks of
		
		0: setTitle('Listado de alumnos con las notas de Febrero/Junio');
		1: setTitle('Listado de alumnos con las notas de Septiembre');
		2: setTitle('Listado de alumnos con las notas de Diciembre');
		
		otherwise
		begin
			
			setTitle('Listado alfabético de alumnos');
			margin := 20;
			
		end;
		
	end;
	
	moveMargin(-8);
	
	repeat
		
		setFormat(BOLD);
		
		write('Apellidos':margin, 'Nombre':margin, 'Login':margin);
		if printMarks > -1 then write('Teórica':10, 'Práctica':10, 'Global':10);
		
		resetFormat;
		downLines(1);
		
		pause := false;
		
		while (not pause) and (i <= link^.eod) do
		begin
			
			if (i mod 2) = 1 then setFormat(REVERSE);
			
			write(link^[i]^.surname:margin, link^[i]^.name:margin, link^[i]^.login:margin);
			
			if printMarks > -1 then
			begin
				
				if trunc(link^[i]^.marks[printMarks].theory) = link^[i]^.marks[printMarks].theory then
					write(link^[i]^.marks[printMarks].theory:10:0)
				else write(link^[i]^.marks[printMarks].theory:10:1);
				
				if trunc(link^[i]^.marks[printMarks].practice) = link^[i]^.marks[printMarks].practice then
					write(link^[i]^.marks[printMarks].practice:10:0)
				else write(link^[i]^.marks[printMarks].practice:10:1);
				
				temp := (link^[i]^.marks[printMarks].practice * WEIGHT_PRACTICE
						+ link^[i]^.marks[printMarks].theory * WEIGHT_THEORY)
						/ (WEIGHT_PRACTICE + WEIGHT_THEORY);
				
				if trunc(temp) = temp then write(temp:10:0)
				else write(temp:10:1);
				
				write(' ');
				
			end;
			
			if (i mod 2) = 1 then resetFormat;
			
			downLines(1);
			
			c := c + 1;
			i := i + 1;
			
			if (c = MAX_LINES) and (link^.eod - i > 4) then
			begin
				
				c := 0;
				pause := true;
				
			end;
			
		end;
		
		if i = link^.eod + 1 then
		begin
			
			downLines(1);
			write('— Pulsa intro para volver al menú principal —');
			readChar(foo);
			
			quit := true;
			
		end
		else quit := stop;
		
	until quit;
	
end;

function stop;
var
	
	option:char;
	
begin
	
	downLines(1);
	write('Pulsa intro para continuar (q e intro para volver al menú principal): ');
	readChar(option);
	
	if option in ['q', 'Q'] then stop := true
	else
	begin
		
		stop := false;
		clearLine;
		
	end;
	
end;

END.