#! /usr/bin/perl

=head1 NAME

user_teachers - administration of teacher accounts

=head1 SYNOPSIS

 https://server/schulkonsole/user_teachers

=head1 DESCRIPTION

C<user_teachers> lets you edit the user lists for teachers.
The HTML template is user_teachers.tt.

=head2 Template variables

Additionally to the variables of Schulkonsole::Session C<user_teachers>
provides the following variables:

=cut

use strict;
use utf8;
use lib '/usr/share/schulkonsole';
use Schulkonsole::Session;
use Schulkonsole::Sophomorix;

my $this_file = 'user_teachers';


my $sk_session = new Schulkonsole::Session($this_file);
if (not $sk_session->get_password()) {
	my $q = new CGI;
	my $url = $q->url( -full => 1 );

	# we send cookies over secure connections only
	if ($url =~ s/^http:/https:/g) {
		$sk_session->redirect($url);
	} else {
		$sk_session->exit_with_login_page($this_file);
	}
}


my $q = $sk_session->query();

my $id = $sk_session->userdata('id');
my $password = $sk_session->get_password();


sub get_teachers {
	my %teachers;

	eval {
	my $teachers_lines
		= Schulkonsole::Sophomorix::read_teachers_file($id, $password);

	my $cnt = 1;
	foreach my $line (@$teachers_lines) {
		next if $line =~ /^#/;

		my ($group, $surname, $firstname, $birthdate, $login,
		    $firstpassword, $short,
		    $diskquota, $mailquota) = split /\s*;/, $line;

		my ($key) = $login =~ /^\s*(.+?)\s*$/;

		my $error = 0;
		if (not $key) {
			$key = "\#$cnt $surname $firstname";
			$error = 1;
			$cnt++;
		}

		$teachers{$key} = {
			group => $group,
			surname => $surname,
			firstname => $firstname,
			birthdate => $birthdate,
			login => $login,
			firstpassword => $firstpassword,
			short => $short,
			diskquota => $diskquota,
			mailquota => $mailquota,
			error => $error,
		};
	}
	};

	return \%teachers;
}



sub put_teachers {
	my $teachers = shift;


	my @lines;
	foreach my $teacher (sort {
			   $$teachers{$a}{surname} cmp $$teachers{$b}{surname}
			or $$teachers{$a}{firstname} cmp $$teachers{$b}{firstname}
		} keys %$teachers) {
		next if $$teachers{$teacher}{delete};

		my $line = $$teachers{$teacher}{group} . ';'
			. $$teachers{$teacher}{surname} . ';'
			. $$teachers{$teacher}{firstname} . ';'
			. $$teachers{$teacher}{birthdate} . ';'
			. $$teachers{$teacher}{login} . ';'
			. $$teachers{$teacher}{firstpassword} . ';'
			. $$teachers{$teacher}{short} . ';'
			. $$teachers{$teacher}{diskquota} . ';'
			. $$teachers{$teacher}{mailquota} . ';'
			. "\n";
		push @lines, $line;

	}

	Schulkonsole::Sophomorix::write_teachers_file($id, $password, \@lines);
}





eval {
COMMANDS: {
$q->param('teachersupload') and do {
	my $old_teachers_lines;
	eval {
	$old_teachers_lines
		= Schulkonsole::Sophomorix::read_teachers_file($id, $password);
	};

	if (    $old_teachers_lines
	    and @$old_teachers_lines) {
		$sk_session->set_status($sk_session->d()->get(
			'lehrer.txt existiert bereits'), 1);
	} else {
		my $filename = $q->param('teachersfilename');
		if ($filename) {
			my @lines;
			while (<$filename>) {
				push @lines, $_;
			}

			Schulkonsole::Sophomorix::write_teachers_file($id, $password,
			                                              \@lines);

			$sk_session->set_status(
				  $sk_session->d()->get('Datei hochgeladen.')
				. ' '
				.  $sk_session->d()->get('Die Benutzerdaten müssen noch in das System übernommen werden.'),
				0);

		} else {
			$sk_session->set_status($sk_session->d()->get(
				'Datei kann nicht gelesen werden'), 1);
		}
	}
	last COMMANDS;
};
$q->param('acceptteachers') and do {
	my $teachers = get_teachers();

	my @errors;
	foreach my $param ($q->param) {
		if (my ($key, $action) = $param =~ /^(.+)_(surname|firstname|birthdate|delete|login)$/) {
			my $value = $q->param($param);
			if ($$teachers{$key}) {
				if (   not $$teachers{$key}{$action}
				    or $$teachers{$key}{$action} !~ /^$value\s*$/) {

					my $is_error = 0;
					CHECKVALUE: {
					$action =~ /^b/ and do {
						if ($value !~ /^\s*\d{1,2}\.\d{1,2}\.\d{4}\s*$/) {
							push @errors, sprintf($sk_session->d()->get(
								'ungültiges Geburtsdatum für %s'),
								$key);

							$sk_session->mark_input_error("${key}_birthdate");

							$is_error = 1;
						}

						last CHECKVALUE;
					};
					$action =~ /^l/ and do {
						if ($$teachers{$value}) {
							push @errors, sprintf($sk_session->d()->get(
								'Login %s schon vorhanden'), $value);

							$sk_session->mark_input_error("${key}_login");

							$is_error = 1;
						} else {
							$$teachers{$key}{error} = 0;
						}

						last CHECKVALUE;
					};

					}

					$$teachers{$key}{$action} = $value unless $is_error;
				}
			} else {
				push @errors, sprintf($sk_session->d()->get(
					'Lehrer %s unbekannt'), $key);
			}
		}
	}



	if (@errors) {
		$sk_session->set_status(join(', ', @errors), 1);
	} else {
		put_teachers($teachers);

		$sk_session->set_status(
			  $sk_session->d()->get('Änderungen übernommen')
			. ' '
			. $sk_session->d()->get('Die Benutzerdaten müssen noch in das System übernommen werden.'),
			0);
	}


	last COMMANDS;
};
$q->param('newteacher') and do {
	my $teachers = get_teachers();

	my $login = $q->param('newlogin');
	my $surname = $q->param('newsurname');
	my $firstname = $q->param('newfirstname');
	my $birthdate = $q->param('newbirthdate');


	my @errors;
	if ($login !~ /^[a-z]{2,16}$/) {
		push @errors, $sk_session->d()->get(
			'Der Loginname muss aus 2 bis 16 Kleinbuchstaben (ohne Umlaute) bestehen');

		$sk_session->mark_input_error('newlogin');
	} elsif ($$teachers{$login}) {
		push @errors, $sk_session->d()->get('Loginname ist schon belegt');

		$sk_session->mark_input_error('newlogin');
	}

	if (not $surname) {
		push @errors, $sk_session->d()->get('Nachname ist leer');

		$sk_session->mark_input_error('newsurname');
	}

	if (not $firstname) {
		push @errors, $sk_session->d()->get('Vorname ist leer');

		$sk_session->mark_input_error('newfirstname');
	}

	if ($birthdate !~ /^\s*\d{1,2}\.\d{1,2}\.\d{4}\s*$/) {
		push @errors, $sk_session->d()->get(
			'verwenden Sie für das Geburtsdatum das Format TT.MM.JJJJ');

		$sk_session->mark_input_error('newbirthdate');
	}


	if (@errors) {
		$sk_session->set_status(join(', ', @errors), 1);
	} else {
		$$teachers{$login} = {
			group => 'lehrer ',
			surname => $surname,
			firstname => $firstname,
			birthdate => $birthdate,
			login => $login,
			firstpassword => '---     ',
			short => 'usertoken ',
			diskquota => 'quota ',
			mailquota => 'mailquota ',
		};


		put_teachers($teachers);

		$sk_session->set_status($sk_session->d()->get(
			'Lehrer hinzugefuegt'), 0);

		$q->delete('newlogin', 'newsurname', 'newfirstname', 'newbirthdate');
	}


	last COMMANDS;
};




}
};
if ($@) {
	$sk_session->standard_error_handling($this_file, $@);
}






my $teachers = get_teachers();
my @teachers;
my @error_teachers;
foreach my $teacher (sort keys %$teachers) {
	if ($$teachers{$teacher}{error}) {
		push @error_teachers, {
				key => $teacher,
				login => $$teachers{$teacher}{login},
				surname => $$teachers{$teacher}{surname},
				firstname => $$teachers{$teacher}{firstname},
				birthdate => $$teachers{$teacher}{birthdate},
				short => ($$teachers{$teacher}{short} ne 'usertoken' ?
				          $$teachers{$teacher}{short}
				        : $$teachers{$teacher}{login}),
			};
	} else {
		push @teachers, {
				login => $$teachers{$teacher}{login},
				surname => $$teachers{$teacher}{surname},
				firstname => $$teachers{$teacher}{firstname},
				birthdate => $$teachers{$teacher}{birthdate},
				short => ($$teachers{$teacher}{short} ne 'usertoken' ?
				          $$teachers{$teacher}{short}
				        : $$teachers{$teacher}{login}),
			};
	}
}

=head3 Template variables specific to user_teachers.tt

=over

=item C<teachers>

The teacher account as an array of hashes with the keys

=over

=item C<login>

The user's login

=item C<firstname>

User's firstname

=item C<surname>

User's surname

=item C<birthdate>

User's birthdate

=item C<short>

User's sign

=back

=cut

$sk_session->set_var('teachers', \@teachers);

$sk_session->set_var('error_teachers', \@error_teachers);



if (    not @teachers
    and not @error_teachers) {
	$sk_session->set_var('teachersuploadallowed', 1);
}


$sk_session->print_page("$this_file.tt", $this_file);


=back

=head2 Form fields

=over

=item C<teachersupload>

Upload file C<teachersfile>

=item C<teachersfile>

Filename of a user list to upload

=item C<acceptteachers>

Write changes to user list:

=over

=item C<${teachers{login}}_firstname>

User's first name
Created in loop over template variable C<teachers>

=item C<${teachers{login}}_surname>

User's surname
Created in loop over template variable C<teachers>

=item C<${teachers{login}}_birthdate>

User's birthdate.
Created in loop over template variable C<teachers>

=back

=item C<newteacher>

Add new user to user list:

=over

=item C<newfirstname>

User's first name

=item C<newsurname>

User's surname

=item C<${newbirthdate>

User's birthdate

=back

=back
