use utf8;
use warnings; no warnings "redefine";
use strict;

use Cf qw($DBCMD_TIMEOUT);
use Dbase::Globals qw(nice_intervall);
use Loader qw(line_in);
use Umlaut qw(textmodus);
use File::Temp qw(tempfile);
use Fehler qw(fehler problem);

sub editor($;$) {
	my($data,$prompt) = @_;
	$prompt="" if not defined $prompt;

	$data="" if not defined $data;

	if(ref $Db::test_input) {
		print " #? $prompt\n";
		while(@$Db::test_input) {
			my $res = shift @$Db::test_input;
			if(ref $res) {
				$res = &$res(caller(0));
				next if not defined $res;
			}
			$res eq "" or $res =~ /\n\z/ or 
				return problem "Editor-Eingabe ohne Linefeed";

			my $pr = $res;
			$pr =~ s/^/#>> /mg;
			$pr="#>>(leer)\n" if $pr eq "";
			print $pr;

			return $res;
		}
		return problem "Eingabedaten zu Ende";
	}

	if ( length $prompt || $DBCMD_TIMEOUT ) {
		print STDERR "$prompt\n" if length $prompt;
		print STDERR "Warnung: Nach ${\nice_intervall($DBCMD_TIMEOUT)} wird der Vorgang abgebrochen!\n" if $DBCMD_TIMEOUT;
		line_in('Weiter mit RETURN...');
	}

	my($fh,$fn) = tempfile();
	unless($fh) {
		fehler "Could not create temp file: $!\n";
		return undef;
	}
	{
		local $| = 1;
		textmodus($fh);
		print $fh $data or do {
			my $x = $!;
			unlink($fn);
			fehler "Write error on temp file: $x\n";
		};
	}
	$fh->close();

	system( defined $ENV{EDITOR} ? $ENV{EDITOR} : 'vi', $fn );
	if($?) {
		$fh->close;
		return problem "Editor error -- not updated.\n";
	}
	open(F,$fn);
	textmodus(\*F);
	my $data2;
	{
		local $/ = undef;
		$data2 = <F>;
	}
	fehler "Read error: $!\n" unless defined $data2;
	close(F);
	return undef if $data eq $data2;
	$data2;
}

1;
