#! /usr/bin/perl

=head1 NAME

class - overview of available classes

=head1 SYNOPSIS

 https://server/schulkonsole/class

=head1 DESCRIPTION

C<class> lets you enter/leave a class and select one of the classes to work
with. The HTML template is class.tt.

=head2 Template variables

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

=over

=cut

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

my $this_file = 'class';


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();

if($sk_session->param('requested_page')) {
	$q->param('requested_page',$sk_session->param('requested_page'));
	$sk_session->clear('requested_page');
}

my $classs = Schulkonsole::Info::groups_classes($sk_session->groups());
foreach my $class (keys %$classs) {
	if ($q->param("${class}_list")) {
		$sk_session->param('class', $class);
		my $url = $q->url( -absolute => 1 );
		if($q->param('requested_page')) {
			my $target = $q->param('requested_page');
			$url =~ s/$this_file$/$target/g;
		} else {
			$url =~ s/$this_file$/class_list/g;
		}
		$sk_session->redirect($url);
	}
}

my $class = $q->param('classes');
if (    $class
    and $$classs{$class}) {
	$sk_session->param('class', $class);

	my $url = $q->url( -absolute => 1 );
	if($q->param('requested_page')) {
		my $target = $q->param('requested_page');
		$url =~ s/$this_file$/$target/g;
	} else {
		$url =~ s/$this_file$/class_list/g;
	}
	$sk_session->redirect($url);
}

$class = $sk_session->param('class');



my $all_classs = Schulkonsole::DB::classes();
delete $$all_classs{'attic'};


eval {
COMMANDS: {
if (my ($new_class) = $q->param('class_add')) {
	if (not $$all_classs{$new_class}) {
		$sk_session->set_status(
			sprintf($sk_session->d()->get('Klasse %s gibt es nicht'),
			        $new_class),
			1);
		last COMMANDS;
	}
	if ($$classs{$new_class}) {
		$sk_session->set_status(
			sprintf($sk_session->d()->get('Sie sind bereits in Klasse %s'),
			        $new_class),
			1);
		last COMMANDS;
	}

	Schulkonsole::Sophomorix::add_to_class(
		$sk_session->userdata('id'),
		$sk_session->get_password(),
		$new_class);
	$sk_session->set_status(
		  sprintf($sk_session->d()->get('In Klasse %s eingetragen.'),
		          $new_class)
		. ' '
		. $sk_session->d()->get('Melden Sie sich unter Windows erneut an, damit Sie auf die Gruppenverzeichnisse zugreifen können.'),
		0);

	$sk_session->read_groups_from_db();
	$classs = Schulkonsole::Info::groups_classes($sk_session->groups());
	$class = $new_class;
	$sk_session->param('class', $class);

} else {
	foreach my $old_class (keys %$classs) {
		if ($sk_session->q_param("${old_class}_remove")) {
			Schulkonsole::Sophomorix::remove_from_class(
				$sk_session->userdata('id'),
				$sk_session->get_password(),
				$old_class);
			$sk_session->set_status(
				sprintf($sk_session->d()->get('Aus Klasse %s ausgetragen'),
					$$classs{$old_class}{displayname}),
				0);

			$sk_session->read_groups_from_db();
			$classs = Schulkonsole::Info::groups_classes($sk_session->groups());
			if ($old_class eq $class) {
				undef $class;
				$sk_session->{session}->clear('class');
			}

			last;	# template uses submit buttons
		}
	}
}
} # end COMMANDS
};
if ($@) {
	$sk_session->standard_error_handling($this_file, $@);
}



my @classs;
my @other_classs;
foreach my $class (sort {
	$$all_classs{$a}{displayname} cmp $$all_classs{$b}{displayname} }
                   keys %$all_classs) {
	if ($$classs{$class}) {
		push @classs, { gid => $class,
		                name => $$all_classs{$class}{displayname} };
	} else {
		push @other_classs, { gid => $class,
		                      name => $$all_classs{$class}{displayname} };
	}
}

=item C<classes>

An array of hashes of the classes of which the current user is a member
with the keys

=over

=item C<gid>

The GID of the class

=item C<name>

The name of the class

=back

=cut

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

=item C<other_classes>

An array of hashes of the classes of which the current user is not a member
with the keys

=over

=item C<gid>

The GID of the class

=item C<name>

The name of the class

=back

=cut

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


if ($class) {

=item C<class_gid>

The GID of the selected class (if a class is selected)

=cut

	$sk_session->set_var('class_gid', $class);

=item C<class_name>

The name of the selected class (if a class is selected)

=cut

	$sk_session->set_var('class_name', $$classs{$class}{displayname});
}

if ($q->param('requested_page')) {

=item C<requested_page>

The name of the requested page (if a page is requested after selection)

=cut

	$sk_session->set_var('requested_page',$q->param('requested_page'));	
}

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


=back

=head2 Form fields

=over

=item C<classes>

Select the class with this GID.
Possible values read in loop over template variable C<classes>.

=item C<${classes{gid}}_list>

Select class with GID and list class.
Created in loop over template variable C<classes>.

=item C<${classes{gid}}_remove>

Leave class with GID
Created in loop over template variable C<classes>.

=item C<class_add>

Enter class with this GID.
Possible values read in loop over template variable C<other_classes>.

=back

