#! /usr/bin/perl

=head1 NAME

linbo_menuedit - edit LINBO's menu.lst files

=head1 SYNOPSIS

 https://server/schulkonsole/linbo_menuedit

=head1 DESCRIPTION

C<linbo_menuedit> lets the user choose a menu.lst file and edit it.
The HTML template is linbo_menuedit.tt.

=head2 Template variables

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

=over

=cut

use strict;
use utf8;
use lib '/usr/share/schulkonsole';
use open ':utf8';
use Schulkonsole::Encode;
use Schulkonsole::Linbo;
use Schulkonsole::Session;


my $this_file = 'linbo_menuedit';



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 $groups = Schulkonsole::Linbo::groups();
my $menulsts = Schulkonsole::Linbo::menulsts();
my $images = Schulkonsole::Linbo::images();

my $is_action;

eval {

SWITCHCOMMAND: {
$q->param('add') and do {
        my $filename = $q->param('filename');

        if ($filename !~ /^menu\.lst\.(?:[a-z\d_]+)$/) {
                $sk_session->set_status(sprintf($sk_session->d()->get(
                        '%s ist keine menu.lst-Datei'), $filename), 1);
                last SWITCHCOMMAND;
        }

        if ($$menulsts{$filename}) {
                $sk_session->set_status(sprintf($sk_session->d()->get(
                        '%s existiert bereits'), $filename), 1);
                last SWITCHCOMMAND;
        }

        my $lines;
        if (open MENULST, '<',
                    Schulkonsole::Encode::to_fs(
                        "$Schulkonsole::Config::_linbo_dir/examples/menu.lst")) {
                flock MENULST, 1;
                seek MENULST, 0, 0;

                {
                local $/ = undef;
                $lines = <MENULST>;
                }
        }
        
        Schulkonsole::Linbo::write_file(
                $sk_session->userdata('id'),
                $sk_session->get_password(),
                $filename,
                $lines);

        $menulsts = Schulkonsole::Linbo::menulsts();
        if ($$menulsts{$filename}) {
                $sk_session->set_status(sprintf($sk_session->d()->get(
                        '%s hinzugefügt'), $filename), 0);
        } else {
                $sk_session->set_status(sprintf($sk_session->d()->get(
                        '%s konnte nicht hinzugefügt werden'), $filename), 0);
        }

        last SWITCHCOMMAND;
};

$q->param('delete') and do {
	my $filename = $q->param('filename');

	if ($filename !~ /^menu\.lst\.(?:[a-z\d_]+)$/) {
		$sk_session->set_status(sprintf($sk_session->d()->get(
			'%s ist keine menu.lst-Datei'), $filename), 1);
		last SWITCHCOMMAND;
	}

	if (not $$menulsts{$filename}) {
		$sk_session->set_status(sprintf($sk_session->d()->get(
			'%s existiert nicht'), $filename), 1);
		last SWITCHCOMMAND;
	}


	Schulkonsole::Linbo::delete_file(
		$sk_session->userdata('id'),
		$sk_session->get_password(),
		$filename);

	$menulsts = Schulkonsole::Linbo::menulsts();
	if (not $$menulsts{$filename}) {
		$sk_session->set_status(sprintf($sk_session->d()->get(
			'%s gel&ouml;scht'), $filename), 0);
	} else {
		$sk_session->set_status(sprintf($sk_session->d()->get(
			'%s konnte nicht gel&ouml;scht werden'), $filename), 0);
	}

	last SWITCHCOMMAND;
};

$q->param('edit') and do {
	my $filename = $q->param('filename');
	if (not $$menulsts{$filename}) {
		$sk_session->set_status(sprintf($sk_session->d()->get(
			'%s existiert nicht'), $filename), 1);
		last SWITCHCOMMAND;
	}


	my $lines = $q->param('menulst');

	Schulkonsole::Linbo::write_file(
		$sk_session->userdata('id'),
		$sk_session->get_password(),
		$filename,
		$lines);

	
	$sk_session->set_status(sprintf($sk_session->d()->get(
		'%s geschrieben'), $filename), 0);

	last SWITCHCOMMAND;
};


=head3 Parameters dependent on selected submit button

The following variables are set if a submit button of the form
<filename>_<command> has been selected. <filename> is the name of a
menu.lst file, and command is either C<edit> or C<delete>.

=cut

foreach my $param ($q->param) {
	if (my ($menulst, $command) = $param =~ /^(.+)_(edit|delete)$/) {
		if (not $$menulsts{$menulst}) {
			$sk_session->set_status(sprintf($sk_session->d()->get(
				'%s existiert nicht'), $menulst), 1);

			last SWITCHCOMMAND;
		}

		if ($command eq 'edit') {
			if (open MENULST, '<',
			         Schulkonsole::Encode::to_fs(
 			         	"$Schulkonsole::Config::_linbo_dir/$menulst")) {
				flock MENULST, 1;
				seek MENULST, 0, 0;

				{
				local $/ = undef;
				my $lines = <MENULST>;
				$q->param('menulst', $lines);
				}

=item C<editfilename>

Name of a file to edit, if <command> is C<edit>.
The contents of the file are in the query parameter C<menulst>.

=cut

				$sk_session->set_var('editfilename', $menulst);
				$is_action = 1;
			} else {
				$sk_session->set_status(sprintf($sk_session->d()->get(
					'Kann Datei %s nicht &ouml;ffnen'), $menulst),
					1);

			}

			last SWITCHCOMMAND;
		} elsif ($command eq 'delete') {

=item C<deletefilename>

Name of a file to delete, if <command> is C<delete>.
(Waiting for confirmation).

=cut

			$sk_session->set_var('deletefilename', $menulst);
			$is_action = 1;

			$sk_session->set_status('Bitte best&auml;tigen', 0);
			last SWITCHCOMMAND;
		}
	}
}

}
};
if ($@) {
	$sk_session->standard_error_handling($this_file, $@);
}



if (not $is_action) {
	my @array_menulsts = sort keys %$menulsts;

=item C<menulsts>

A list of all menulsts

=cut

	$sk_session->set_var('menulsts', \@array_menulsts);
}


if (not $is_action) {
        my @array_nomenulsts = ();
        foreach my $group (keys $groups) {
            my $menufile = 'menu.lst.'.$group;
            if (not $$menulsts{$menufile}) {
                push(@array_nomenulsts, $menufile);
            }
        }

=item C<nomenulsts>

A list of all groups without menu.lsts.group files

=cut
        if (@array_nomenulsts) {
            $sk_session->set_var('nomenulsts', \@array_nomenulsts);
        }
}

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







=back

=head2 Form fields

=over

=item C<filename>

Filename to process

=item C<delete>

Delete C<filename> if selected

=item C<edit> and C<menulst>

Write C<menulst> to C<filename> if selected

=item C<menulsts_edit>

Edit file C<menulsts> if selected

=item C<menulsts_delete>

Ask to confirm deletion of file C<menulst> if selected

=item C<menulst_new>

Create C<filename> if selected

=back

