use utf8;
use warnings; no warnings "redefine";
use strict;
use Loader qw(line_init line_print_end line_set line_printer);
use Cf qw($MODE $POPHOME);
use Dbase::Globals qw(find_descr list_descr get_descr test_descr_flag);
use Dbase::Help qw(DoTime in_test DoTransSuspend);
use Fehler qw(report_status problem );
use Encode qw();
use UTFkram qw(decode_anything is_utf8);
#use Term::ANSIColor qw(GREEN ON_BLACK RESET);

my $lm = 0;

# Flag:
## 1 Passwort
## 2 Passwort: kein Linefeed hinterherschicken
## 4 Menu ( TODO => Druckerauswahl und so)

my $test_ende;

sub line_in($;$$$) {
	my($prompt,$flag,$prev,$template) = @_;
	$prompt .= " " if $prompt !~ s/\s(\S)$/$1 / and $prompt =~ /\S$/;
	$prompt = Encode::encode("iso-8859-15",$prompt,Encode::FB_DEFAULT)
		unless $Db::utf8;
	#$prompt = GREEN . ON_BLACK . "[$MODE]" . RESET . " $prompt" if in_test();
	$prompt = "[$MODE] $prompt" if in_test();
	$flag = 0 unless defined $flag;

	if ($flag & 4) {
		line_print_end;
	}
	if(ref $Db::test_input) {
		print " #? $prompt\n";
		while(@$Db::test_input) {
			my $res = shift @$Db::test_input;
			return problem "'undef' als Eingabe ist nicht sinnvoll"
				if not defined $res;
			if(ref $res) {
				if(ref $res eq "ARRAY") {
					unshift @$Db::test_input,@$res;
					next;
				} else {
					$res = &$res(caller(0));
					next if not defined $res;
				}
			}
			$res =~ /\n/ and return problem "Eingabedaten mit Linefeed";
			print " # '$res'\n";
			return $res;
		}
		return problem "Eingabedaten zu Ende";
	}
	return problem "Input nicht vom Terminal" 
		if not -t STDIN;

	report_status(4|8);

	if($flag & 1) {
		my $foo;

		print $prompt;
		system("stty -echo");
		DoTransSuspend { $foo = <STDIN>; };
		system("stty echo");
		chomp $foo; print "\n" unless $flag&2;
		return $foo;
	}

	my $term = line_init();
	$term->addhistory($prev) if $term and defined $prev and length($prev)>2;

line_redo:
	my $llm = (stat "$POPHOME/bin/kunde")[9];
	if(not $lm) {
		$lm = $llm;
	} elsif(defined $llm and $lm != $llm) {
		print STDERR <<'END' if $lm;

Das 'kunde'-Programm wurde neu eingespielt.
Bitte raus hier, und neu starten.

END
		# $lm = $llm;
	}

	my $res;
	unless ($term) {
		print $prompt;
		$res = scalar <>;
		chomp $res;
	} elsif ( defined $template ) {
		my $save_startup_hook = $term->{startup_hook};
		$term->{startup_hook} = sub { $term->insert_text($template) };
		DoTransSuspend { $res = $term->readline($prompt); };
		$term->{startup_hook} = $save_startup_hook;
	} else {
		DoTransSuspend { $res = $term->readline($prompt); };
	}

	if(defined $res) {
		$res =~ s/\s+\z//;
		$res =~ s/^\s+//;
	}

	if($flag & 4 and defined $res and $res =~ s/^\>//) {
		my $perm = ($res =~ s/^\>//);
		if($res eq "?") {
			print <<END;
Mit dieser Funktion kann die nächste / können alle folgenden Ausgaben
von Listen (im allgemeinen die 'l'- und 'p'-Funktionen) aus der DB mit
'less' durchgesehen oder in eine Datei oder auf einen Drucker umgeleitet
werden.
Die Angabe "noperm" bedeutet, dass eine permanente Umleitung nicht möglich ist.

Ausgabeoptionen:
>X   Ausgabe auf X (einmalig)
>>X  Ausgabe auf X (permanent)

X:
END
			print list_descr("ausgabe",1,"!hide");
		} else {
			line_set($res, $perm?1:0)
		}
		goto line_redo;
	}
	{
		no warnings 'once';
		$Db::pr_fh ||= $Db::OutHandle;
		$RT::time = DoTime;
	}

	# temporärer Workaround, für die utf8-Nutzer unter uns :-/
	$res = decode_anything ($res) if is_utf8($res);
	$res;
}

1;
