#! /usr/bin/perl
#
# $Id$
#

=head1 NAME

group_lesson - overview of project lessons

=head1 SYNOPSIS

 https://server/schulkonsole/project_lesson

=head1 DESCRIPTION

C<project_lesson> lets you select a project, start a lesson in a project
and control WLAN access for the selected project.
The HTML template is project_lesson.tt.

=head2 Template variables

Additionally to the variables of Schulkonsole::Session and
Schulkonsole::Lesson::set_vars() C<project_lesson> provides the following variables:

=cut

use strict;
use utf8;
use lib '/usr/share/schulkonsole';
use Time::Local;
use POSIX;
use Schulkonsole::Config;
use Schulkonsole::DB;
use Schulkonsole::Session;
use Schulkonsole::Radius;
use Schulkonsole::Sophomorix;
use Schulkonsole::Info;
use Schulkonsole::Lesson;
use Data::Dumper;

my $this_file = 'project_lesson';

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 $projects = Schulkonsole::Info::groups_projects($sk_session->groups());

my $project = $q->param('projects');
if (    $project
    and $$projects{$project}) {
        $sk_session->param('project', $project);
}
$project = $sk_session->param('project');

if (   not $project
    or not $$projects{$project}) {
        my $url = $q->url( -absolute => 1 );
        $url =~ s/$this_file$/project/g;
		$sk_session->param('requested_page',$this_file);
        $sk_session->redirect($url);
}

my $admins = Schulkonsole::DB::project_admins($$projects{$project}{id});
my $is_admin = $$admins{$sk_session->userdata('uidnumber')};
my $is_joinable = $$projects{$project}{joinable};

$sk_session->param('group',$project);
my $member_userdatas
	= Schulkonsole::DB::project_user_members($$projects{$project}{gidnumber});

=head2 Form fields

none


=head2 Template variables

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

=over

=cut

my $group_session = new Schulkonsole::Lesson($sk_session);


if ($group_session) {

	my $group = $group_session->info('name');
	my $id = $sk_session->userdata('id');
	my $password = $sk_session->get_password();

	my $editing_userdata = $group_session->info('editing_userdata');
	my $editing_user = $$editing_userdata{uid};
	
# perform commands
	
	
	COMMANDS: { eval {
	if ($q->param('acceptlesson')) {
		if (not $group_session->info('is_editing')) {
			if (not $group_session->param('edit')) {
				$sk_session->set_status(
					$sk_session->d()->get(
						"In diesem Projekt findet kein Unterricht statt."),
					1);
			} else {
				$sk_session->set_status(
					$sk_session->d()->get(
						"Sie halten keinen Unterricht in diesem Projekt."),
					1);
			}
			last COMMANDS;
		}
	
		my $wlan_allowed = Schulkonsole::Radius::allowed_groups_users_wlan($id, $password);
		
		my @allow_wlan;
		my @deny_wlan;
		
		foreach my $user (keys %$member_userdatas){
			if ($q->param("$user;wlan") and not $$wlan_allowed{'users'}{$user}) {
				push @allow_wlan, $user;
			} elsif ($$wlan_allowed{'users'}{$user} and not defined $q->param("$user;wlan")) {
				push @deny_wlan, $user;
			}
		}
		
		eval {
	       	Schulkonsole::Radius::wlan_on($id, $password,[],\@allow_wlan) if @allow_wlan;
    	   	Schulkonsole::Radius::wlan_off($id, $password,[],\@deny_wlan) if @deny_wlan;
		};
		if ($@) {
			$sk_session->standard_error_handling($this_file, $@);
		}
		
		$sk_session->set_status(
			$sk_session->d()->get("Änderungen übernommen."), 0);
	
	} elsif ($q->param('start_lesson')) {
		if ($group_session->param('edit')) {
			$sk_session->set_status(
				$sk_session->d()->get("In diesem Projekt wird bereits unterrichtet."),
				1);
			last COMMANDS;
		}
	
	
		$group_session->start_lesson($id, $password);
	
		$editing_user = $sk_session->userdata('uid');
	
	
		$sk_session->set_status($sk_session->d()->get("Unterricht begonnen.")
			. ' ' . POSIX::strftime(
			  	$sk_session->d()->get("Unterrichtsende um %H:%M"),
			  	localtime($group_session->param('end_time'))),
			0);
	} elsif ($q->param('end_lesson_now')) {
		if (not $group_session->info('is_allowed_stopedit')) {
			if (not $group_session->param('edit')) {
				$sk_session->set_status(
					$sk_session->d()->get(
						"In diesem Projekt findet kein Unterricht statt."),
				1);
			} else {
				$sk_session->set_status(
					$sk_session->d()->get(
						"Sie dürfen den Unterricht in diesem Projekt nicht beenden."),
					1);
			}
			last COMMANDS;
		}
	
		$group_session->end_lesson_now($id, $password);
	
		$sk_session->set_status(
			$sk_session->d()->get('Unterricht beendet.'), 0);
	
	
	} elsif ($q->param('end_lesson_at')) {
		if (not $group_session->info('is_editing')) {
			if (not $group_session->param('edit')) {
				$sk_session->set_status(
					$sk_session->d()->get(
						'In diesem Projekt findet kein Unterricht statt.'),
					1);
			} else {
				$sk_session->set_status(
					$sk_session->d()->get(
						'Sie dürfen den Unterricht in diesem Projekt nicht beenden.'),
					1);
			}
			last COMMANDS;
		}

		my @end_time = localtime($^T);
		$end_time[2] = $q->param('lesson_end_hours');
		$end_time[1] = $q->param('lesson_end_minutes');
		$end_time[0] = 0;
	
		my $end_time = Time::Local::timelocal(@end_time);
	
		if ($end_time < $^T) {
			$sk_session->set_status(
				$sk_session->d()->get("Unterrichtsende liegt in der Vergangenheit"),
				1);
		} else {
			$group_session->end_lesson_at($id, $password, $end_time);
			$group_session = new Schulkonsole::Lesson($sk_session);
	
			$sk_session->set_status(
				POSIX::strftime(
					$sk_session->d()->get("Unterrichtsende um %H:%M"), @end_time),
				0);
		}
	}
	
	}; } # end COMMANDS
	if ($@) {
		$sk_session->standard_error_handling($this_file, $@);
	}
	
	
	
	# collect data for output
	eval {
		my $wlan_allowed =
			Schulkonsole::Radius::allowed_groups_users_wlan($id, $password);

		my @members;
		foreach my $user (sort {
			$$member_userdatas{$a}{surname} cmp $$member_userdatas{$b}{surname} }
			keys %$member_userdatas) {
		
			my $member = {
				login => $user,
				firstname => $$member_userdatas{$user}{firstname},
				surname => $$member_userdatas{$user}{surname},
				wlan => $$wlan_allowed{'users'}{$user}? 1 : 0,
			};
			push @members, $member;
		}
	
=item C<members>

An array of hashes with the keys

=over

=item C<login>

The login of a user

=item C<firstname>

The user's first name

=item C<surname>

The user's surname

=item C<wlan>

The user's wlan status (allowed-1/forbidden-0)

=back

=cut

	$sk_session->set_var('members', \@members);
	
	};
	if ($@) {
		$sk_session->standard_error_handling($this_file, $@);
	}
	
	$group_session->set_vars($sk_session);
	
	# pre-set form fields with suggested values for lesson end time
	my $start_time = $group_session->param('start_time');
	if ($start_time) {
		my @suggested_end_time = localtime($start_time + 90 * 60);
		$q->param('lesson_end_hours', $suggested_end_time[2]);
		$q->param('lesson_end_minutes', int($suggested_end_time[1] / 5) * 5);
	}
}



if ($$admins{$sk_session->userdata('uidnumber')}) {

=item C<isadmin>

Indicates that the current user is an administrator of the selected project

=cut

        $sk_session->set_var('isadmin', 1);

}


my @projects;
foreach my $project (sort {
        $$projects{$a}{displayname} cmp $$projects{$b}{displayname} }
                         keys %$projects) {
        push @projects, { gid => $project,
                          name => $$projects{$project}{displayname},
                        };
}

=item C<projects>

Projects of the current user as an array of hashes with the keys

=over

=item C<gid>

GID of the project

=item C<name>

Name of the project

=item C<addquota>

Additional quota for members of this project

=item C<isadmin>

True if the current user is an administrator of the project

=item C<islastadmin>

True if there are no other administrators of the project but the current
user

=back

=cut

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


if ($project) {

=item C<project_gid>

GID of the selected project

=cut

        $sk_session->set_var('project_gid', $project);

=item C<project>

Name of the selected project

=cut

        $sk_session->set_var('project', $$projects{$project}{displayname});

}

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


=back

=head2 Form fields

=over

=item C<end_lesson_now>

End lesson at once (reset network and share settings)

=item C<end_lesson_at>

Set a time to end the lesson (reset network and share settings)

=item C<start_lesson>

Start a lesson in the room (and allow changes to network and share settings)

=item C<acceptlesson>

Accept new wlan settings

=back

