#! /usr/bin/perl

=head1 NAME

settings_projects - produces page for settings_projects

=head1 SYNOPSIS

 https://server/schulkonsole/settings_projects

=head1 DESCRIPTION

C<settings> produces the page of settings for projects.
The HTML template is settings_projects.tt.

=head2 Template variables

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

=over

=cut
use strict;
use utf8;
use lib '/usr/share/schulkonsole';
use Schulkonsole::DB;
use Schulkonsole::Files;
use Schulkonsole::Radius;
use Schulkonsole::Session;
use Schulkonsole::Sophomorix;


my $this_file = 'settings_projects';

my %yesno = (
	1 => 'yes',
	0 => 'no',
);

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



my $projects;
my $wlanprojects;
COMMANDS: { eval {

$projects = Schulkonsole::DB::projects();

$wlanprojects = Schulkonsole::Radius::wlan_defaults();

if ($q->param('accept')) {
	my @create_maillist = ();
	my @remove_maillist = ();
	my @create_mailalias = ();
	my @remove_mailalias = ();
	my @enable_wlan = ();
	my @disable_wlan = ();
	my @ignore_wlan = ();
	my $changes = 0;
	foreach my $project (keys %$projects) {
		if ($q->param("${project}_maillist")) {
			push @create_maillist, $project unless $$projects{$project}{maillist};
		} else {
			push @remove_maillist, $project if $$projects{$project}{maillist};
		}
		if ($q->param("${project}_mailalias")) {
			push @create_mailalias, $project unless $$projects{$project}{mailalias};
		} else {
			push @remove_mailalias, $project if $$projects{$project}{mailalias};
		}
		if ($q->param("${project}_wlan") == 1) {
			push @enable_wlan, $project unless exists $$wlanprojects{'groups'}{$project} 
							and $$wlanprojects{'groups'}{$project} eq 'on';
		} elsif ($q->param("${project}_wlan") == -1) {
			push @ignore_wlan, $project unless exists $$wlanprojects{'groups'}{$project}
							and $$wlanprojects{'groups'}{$project} eq '-';
		} else {
			push @disable_wlan, $project unless exists $$wlanprojects{'groups'}{$project}
							and $$wlanprojects{'groups'}{$project} eq 'off';
		}
	}

	if (@create_maillist
	    or @remove_maillist) {
		Schulkonsole::Sophomorix::change_maillist_projects(
			$id, $password,
			\@create_maillist, \@remove_maillist);
		$changes = 1;
	}
	
	if (@create_mailalias
	    or @remove_mailalias) {
		Schulkonsole::Sophomorix::change_mailalias_projects(
			$id, $password,
			\@create_mailalias, \@remove_mailalias);
		$changes = 1;
	}

	if (@enable_wlan or @disable_wlan or @ignore_wlan) {
		Schulkonsole::Radius::wlan_on($id, $password, \@enable_wlan,[]) if @enable_wlan;
		Schulkonsole::Radius::wlan_off($id, $password, \@disable_wlan,[]) if @disable_wlan;
		my $lines = Schulkonsole::Radius::new_wlan_defaults_lines(
                        \%$wlanprojects, \@enable_wlan, \@disable_wlan, \@ignore_wlan, [], [], []);
		Schulkonsole::Files::write_wlan_defaults_file($id, $password, $lines);
		$changes = 1;
	}

	if ($changes) {
		$projects = Schulkonsole::DB::projects();
		$wlanprojects = Schulkonsole::Radius::wlan_defaults();
		
		$sk_session->set_status($sk_session->d()->get(
			'Änderungen übernommen.'), 0);
	} else {
		$sk_session->set_status($sk_session->d()->get(
			'Keine Änderungen.'), 0);
	}
	# write defaults
	my %preferences_new;
	$changes = 0;
	my $value = ($q->param('default_mailalias')? 'on' : 'off');
	if($Schulkonsole::Config::_project_mailalias ne $value){
		$preferences_new{'mailalias'} = $value;
		$changes = 1;
	}
	$value = ($q->param('default_maillist')? 'on' : 'off');
	if($Schulkonsole::Config::_project_maillist ne $value){
		$preferences_new{'maillist'} = $value;
		$changes = 1;
	}
	$value = ($q->param('default_wlan') == 1 ? 'on' : ($q->param('default_wlan') == -1 ? '-' : 'off'));
	if($Schulkonsole::Config::_project_wlan ne $value){
		$preferences_new{'wlan'} = $value;
		$changes = 1;
	}
	if ($changes) {
		my $lines = Schulkonsole::Config::new_preferences_lines($Schulkonsole::Config::PROJECTPREFS, \%preferences_new);
		Schulkonsole::Files::write_preferences_conf_file($id, $password, $lines);
		$sk_session->set_status($sk_session->d()->get(
			'Änderungen übernommen.'), 0);
	}
}
};
} # COMMANDS
if ($@) {
	$sk_session->standard_error_handling($this_file, $@);
}




my %on_off = (
        on => 1,
        off => 0,
        '-' => -1,
);

my @projects;
push @projects, 
{ gid => 'default',
  name => 'default',
  mailalias => $on_off{$Schulkonsole::Config::_project_mailalias},
  maillist => $on_off{$Schulkonsole::Config::_project_maillist},
  wlan => $on_off{$Schulkonsole::Config::_project_wlan},
};

foreach my $project (sort {
	my ($A) = $$projects{$a}{displayname} =~ /^(\d+)/;
	my ($B) = $$projects{$b}{displayname} =~ /^(\d+)/;
	   $A <=> $B
	or $$projects{$a}{displayname} cmp $$projects{$b}{displayname} }
                   keys %$projects) {
        my $wlan;
        if (exists $$wlanprojects{'groups'}{$project}) {
                        $wlan = $on_off{$$wlanprojects{'groups'}{$project}};
        } else {
                        $wlan = $on_off{$$wlanprojects{'groups'}{default}};
        }
	push @projects, { gid => $project,
	                name => $$projects{$project}{displayname},
	                maillist => $$projects{$project}{maillist},
	                mailalias => $$projects{$project}{mailalias},
	                wlan => $wlan,
	              };
}

=item C<projects>

An array of hashes of the projects with the keys

=over

=item C<gid>

The GID of the project

=item C<name>

The name of the project

=item C<maillist>

The project has a maillist

=item C<mailalias>

The project students have a mailalias

=item C<wlan>

The default state of wlan access 0: off, 1: on

=back

The first project in the array has the name default and contains
the default settings for newly created projects

=cut

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




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




=back

=head2 Form fields

=over

=item C<accept>

Write the changes

=cut

