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

use Fehler qw(report_fehler);
use Dbase::Help qw(DoFn isotime isodate DoTransSuspend);
use Dbase::Globals qw(get_descr mpersinfo persinfo);
use Loader qw(list_ticket_addrs);

use IO::Pipe;

sub ticket_get_text ($$;$) {
  my($id,$seq,$flags) = @_;

  DoTransSuspend {

	flush STDOUT; flush STDERR;
	my $fh = new IO::Pipe;
	my $pid = fork();
	return undef unless defined $pid;
	if($pid) {
		$fh->reader;
		${*$fh}{'io_pipe_pid'} = $pid;  ## THIS IS A HACK

		return $fh if $flags & 64;

		my $out = "";
		while(<$fh>) {
			$out .= $_;
		}
		$fh->close;
		return $out;
	}
	$fh->writer;

	eval { # just to protect against "return" or "die" in there
		if($seq and $flags & (32+1)) {
			my ($msgid,$werm,$werp,$date,$extern,$data,$ddata,$typ) = DoFn("select id,email,person,0+timestamp,extern,length(inhalt),data,typ from ticketid where ticket = $id and seq = $seq");
			die "# no text for $id:$seq\n" if $id eq "";

			if($flags & 32) {
				if($flags & 1) {
					$date = isotime($date);
					print $fh "Ticket  : $id\n";
					print $fh "Text  # : $seq\n";
					print $fh "Bytes   : $data\n";
					print $fh "ID      : $msgid\n";
					print $fh "Datum   : $date\n";
					print $fh "intern  : ".(($extern eq "n")?"ja":"nein")."\n";
					print $fh "Autor   : ".((defined $werp)?persinfo($werp):(defined $werm)?$werm:"--")."\n";
					print $fh "Daten RT: $ddata\n" if defined $ddata;
					print $fh "Typ   RT: ".get_descr("tickett",$typ)."\n" if defined $typ;
					print $fh "\n";
				} else {
					$date = isodate($date);
					print $fh " $date ".mpersinfo($werp) if defined $werp;
					print $fh " $date $werm" if defined $werm and not defined $werp;
					print $fh " $date --" if not defined $werp and not defined $werm;
					print $fh " (INTERN)" if $extern eq "n";
					printf $fh " [%.1f]",$data/1024;
				}
				exit 0;
			}
		}

		my $seqlim;
		if($seq == 0) {
			$seq = DoFn("select max(seq) from ticketid where ticket = $id");
		}
		if(not $flags & 128) {
			$seqlim = $seq || 0;
		} else {
			$seqlim = 0;
		}
		do {
			if($flags & 2 or DoFn("select extern from ticketid where ticket = $id and seq = $seq") eq "y") {
				if($flags & 128) {
					my ($werp,$werm,$date,$extern) = DoFn("select person,email,0+timestamp,extern from ticketid where ticket = $id and seq = $seq");
					print $fh "# INTERN " if $extern eq "n";
					if($date) {
						my $date = isotime($date);
						print $fh "# $seq # $date #";
					} else {
						print $fh "# $seq #";
					}
					print $fh " ".mpersinfo($werp)." #\n" if defined $werp;
					print $fh " $werm #\n" if defined $werm and not defined $werp;
					print $fh " -- #\n" if not defined $werm and not defined $werp;
					#print "\n";
				}
				my $data = DoFn("select inhalt from ticketid where ticket = $id and seq = $seq");
				$data =~ s/^.*?\n\n//s unless $flags & 16;
				print $fh $data;
			}

			if($seq > $seqlim) {
				$seq--;
			} elsif($seq < $seqlim) {
				$seq++;
			}
			print $fh "\n" if $seqlim != $seq;
		} while($seqlim != $seq);

		if($flags & 512) {
			print $fh "\n\n*** Adressen:\n\n";
			list_ticket_addrs($id,"",$fh);
		}
	};

	$|=1; print $fh "\n\n$@" if $@;
	exit(0);
fehler:
	report_fehler();
	exit(1);
  };
}
1;
