#! /usr/bin/perl

=head1 NAME

settings - produces start page for settings

=head1 SYNOPSIS

 https://server/schulkonsole/settings

=head1 DESCRIPTION

C<settings> produces the start page of settings.
The HTML template is settings.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_classs';


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 $classs;
my $wlanclasss;

COMMANDS: { eval {

$classs = Schulkonsole::DB::all_classes();
delete $$classs{'attic'};

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

if ($q->param('accept')) {
	my @hide_classs = ();
	my @unhide_classs = ();
	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 $class (keys %$classs) {
		if ($q->param("${class}_visible")) {
			if ($$classs{$class}{type} ne 'adminclass') {
				push @unhide_classs, $class;
			}
		} elsif ($$classs{$class}{type} eq 'adminclass') {
			push @hide_classs, $class;
		}
		
		if ($q->param("${class}_maillist")) {
			push @create_maillist, $class unless $$classs{$class}{maillist};
		} else {
			push @remove_maillist, $class if $$classs{$class}{maillist};
		}
		if ($q->param("${class}_mailalias")) {
			push @create_mailalias, $class unless $$classs{$class}{mailalias};
		} else {
			push @remove_mailalias, $class if $$classs{$class}{mailalias};
		}
		if ($q->param("${class}_wlan") == 1) {
			push @enable_wlan, $class unless exists $$wlanclasss{'groups'}{$class} 
							and $$wlanclasss{'groups'}{$class} eq 'on';
		} elsif ($q->param("${class}_wlan") == -1) {
			push @ignore_wlan, $class unless exists $$wlanclasss{'groups'}{$class}
							and $$wlanclasss{'groups'}{$class} eq '-';
		} else {
			push @disable_wlan, $class unless exists $$wlanclasss{'groups'}{$class}
							and $$wlanclasss{'groups'}{$class} eq 'off';
		}
		
	}

	if (   @hide_classs
	    or @unhide_classs) {
		Schulkonsole::Sophomorix::hide_unhide_classes(
			$id, $password,
			\@hide_classs, \@unhide_classs);
		$classs = Schulkonsole::DB::all_classes();
		delete $$classs{'attic'};
		$changes = 1;
	}

	if (@create_maillist
	    or @remove_maillist) {
		Schulkonsole::Sophomorix::change_maillist_classes(
			$id, $password,
			\@create_maillist, \@remove_maillist);
		$changes = 1;
	}
	
	if (@create_mailalias
	    or @remove_mailalias) {
		Schulkonsole::Sophomorix::change_mailalias_classes(
			$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(\%$wlanclasss, \@enable_wlan, \@disable_wlan, 
							\@ignore_wlan, [], [], []);
		Schulkonsole::Files::write_wlan_defaults_file($id, $password, $lines);
        $changes = 1;
	}

	if ($changes) {
		$classs = Schulkonsole::DB::all_classes();
		delete $$classs{'attic'};
		
		$wlanclasss = 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::_class_mailalias ne $value){
		$preferences_new{'mailalias'} = $value;
		$changes = 1;
	}
	$value = ($q->param('default_maillist')? 'on' : 'off');
	if($Schulkonsole::Config::_class_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::_class_wlan ne $value){
		$preferences_new{'wlan'} = $value;
		$changes = 1;
	}
	if ($changes) {
		my $lines = Schulkonsole::Config::new_preferences_lines($Schulkonsole::Config::CLASSPREFS, \%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 @classs;
push @classs, 
{ gid => 'default',
  name => 'default',
  mailalias => $on_off{$Schulkonsole::Config::_class_mailalias},
  maillist => $on_off{$Schulkonsole::Config::_class_maillist},
  wlan => $on_off{$Schulkonsole::Config::_class_wlan},
};

foreach my $class (sort {
	my ($A) = $$classs{$a}{displayname} =~ /^(\d+)/;
	my ($B) = $$classs{$b}{displayname} =~ /^(\d+)/;
	   $A <=> $B
	or $$classs{$a}{displayname} cmp $$classs{$b}{displayname} }
                   keys %$classs) {
        my $wlan;
        if (exists $$wlanclasss{'groups'}{$class}) {
                        $wlan = $on_off{$$wlanclasss{'groups'}{$class}};
        } else {
                        $wlan = $on_off{$$wlanclasss{'groups'}{default}};
        }
	push @classs, { gid => $class,
	                name => $$classs{$class}{displayname},
	                visible => $$classs{$class}{type} eq 'adminclass',
                        maillist => $$classs{$class}{maillist},
                        mailalias => $$classs{$class}{mailalias},
                        wlan => $wlan
	              };
        if (not defined($q->param("${class}_wlan"))) {
                        $q->param("${class}_wlan",$wlan);
        }
}

=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

=item C<visible>

The class is visible and should be displayed in the Schulkonsole, 
otherwise not

=item C<maillist>

The class has a maillist

=item C<mailalias>

The class students have a mailalias

=item C<wlan>

The status of wlan access for this class

=back

=cut

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




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




=back

=head2 Form fields

=over

=item C<accept>

Write the changes

=cut
