#! /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 Env::Bash;
use Schulkonsole::Encode;
use Schulkonsole::Config;
use Schulkonsole::Files;
use Schulkonsole::Session;
use Sophomorix::SophomorixAPI;
use Sophomorix::SophomorixConfig;


my $this_file = 'settings_program';


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 %preferences_conf = Schulkonsole::Config::read_preferences_conf();
my %preferences_conf_new;

if ($q->param('accept')) {
	my @errors;

	foreach my $key (keys %preferences_conf) {
		if ($key eq 'conf_check_passwords') {
			if ($q->param($key)){
				$preferences_conf_new{$key} = 1;
			}
			else {
				$preferences_conf_new{$key} = 0;
			}
		}
		elsif (my $value = $q->param($key)) {	# will ignore $value == 0
			$value =~ s/^\s*(.+)\s*$/$1/;

			if ($preferences_conf{$key} ne $value) {
				CHECKVALUE: {
				$key eq 'conf_max_idle_time' and do {
					my $new_value = int($value);
					if (not $new_value) {
						push @errors, $sk_session->d()->get(
							'Die Sitzungsdauer muss in Minuten angegeben werden');
					} else {
						$value = $new_value;
					}

					last CHECKVALUE;
				};
				$key eq 'conf_min_password_len' and do {
					my $new_value = int($value);
					if (not $new_value) {
						push @errors, $sk_session->d()->get(
							'Der Wert für die minimale Passwortlänge ist ungültig');
					}  else {
						$value = $new_value;
					}
					last CHECKVALUE;
				};
				$key eq 'conf_wlan_ldap_group' and do {
					my ($new_value) = $value =~ /^([a-z0-9p\_]+)$/;
					if (not $new_value) {
						push @errors, $sk_session->d()->get(
							'Der Name der WLAN-LDAP-Gruppe ist ungültig.');
					} else {
						$value = $new_value;
					}
					last CHECKVALUE;
				};
				} # CHECKVALUE
				$preferences_conf_new{$key} = $value;
			} # if($preferences_conf...)
		} # if(my $value...)
	} # foreach

	# commit changes
	if (@errors) {
		$sk_session->set_status(join(', ', @errors), 1);
	} elsif (%preferences_conf_new) {
		my $lines = Schulkonsole::Config::new_preferences_lines($Schulkonsole::Config::SKPREFS, \%preferences_conf_new);
		Schulkonsole::Files::write_preferences_conf_file(
			$id, $password, $lines);

		$sk_session->set_status(
			$sk_session->d()->get('Änderungen übernommen'), 0);
	}
} # if(accept...)



# pre-set values for <form>
foreach my $key (keys %preferences_conf) {
	if (defined $preferences_conf_new{$key}) {
		$q->param($key, $preferences_conf_new{$key});
	} else {
		$q->param($key, $preferences_conf{$key});
	}
}


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




=back

=head2 Form fields

=over

=item C<accept>

Write the changes

=cut




=back
