#!/usr/bin/perl -w

require 5.000;
use lib '/usr/local/bin',"$ENV{HOME}/bin",'/usr/stud/loescher/bin';
use lib 'd:/bin','c:/mydos','c:/bin';
use slmini;
use FileHandle;
use Tk;
use Tk::After;

######################################################################
### Voreinstellungen
######################################################################

$version = '1.14';
$appname = 'xppp';

$version++; # Wegen "-w"

$ppp    = '/usr/sl/ppp';
$pppoff = '/usr/sl/ppp-off';

$konfigdir   = '/root/ppp';
$debug = 0; # Mails versenden?
# if ($ENV{ichbin} eq 'loescher') { $debug = 0 };
$geometry = '+576+0';
$aktualisierung = 60*1000; # 1 Minute
$temp = (localtime())[6];
$feiertag = (($temp==6)||($temp==0)||$feiertag) ? $TRUE : $FALSE;

######################################################################
### Hauptprogramm
######################################################################

my $w = new MainWindow;

$w->title($appname);
$w->iconname($appname);

my $w_frame = $w->Frame;
$w_frame->pack(
		 -side => 'bottom',
		 -fill => 'x',
		 -pady => '2m',
		);

# Provider feststellen
@provider = ();
die "Kann Verzeichnis $konfigdir nicht lesen!\n" unless -r $konfigdir;
foreach (glob("$konfigdir/*"))
{
  if (-d)
  {
    s/$konfigdir\/*//go;
    next if /sysconf/;
    push @provider, $_;
  }
}

# $w_frame->Button() liefert einen Handle zurück, den man später wieder
# hernhemen könnte


# Kopfzeilen:
$w_nebeneinander = $w->Frame;
$w_nebeneinander->pack(qw(-side top -fill x));
$w_nebeneinander->Label(
			 -text    => 'Provider',
			)->pack(qw(-side left -expand 1));
$w_nebeneinander->Label(
			-text => 'Kosten',
		       )->pack(qw(-side left));
$w_nebeneinander->Label(
			-text    => 'Info',
		       )->pack(qw(-side left));
$w_nebeneinander->Label(
			-text    => 'Einwahl',
		       )->pack(qw(-side left));
$w_nebeneinander->Label(
			-text    => '5 Min',
		       )->pack(qw(-side left));
$w_nebeneinander->Label(
			-text    => '15 Min',
		       )->pack(qw(-side left));
$w_nebeneinander->Label(
			-text    => '30 Min',
		       )->pack(qw(-side left));
$w_nebeneinander->Label(
			-text    => '60 Min',
		       )->pack(qw(-side left));

foreach $provider (@provider)
{
  $w_nebeneinander = $w->Frame;
  $w_nebeneinander->pack(qw(-side top -fill x));
  $w_nebeneinander->Button(
			   -text    => $provider,
			   -command => [ \&start_ppp , $provider ],
			  )->pack(qw(-side left -expand 1));
  $kostenlabel{$provider} = Kosten($provider);
  $w_nebeneinander->Label(
			  -textvariable => \$kostenlabel{$provider},
			  )->pack(qw(-side left));

  $w_nebeneinander->Button(
			   -text    => 'Info',
			   -command => [ \&info , $provider ],
			  )->pack(qw(-side left));
  $w_nebeneinander->Label(
			  -width => 5,
			  -text    => sprintf("%.2f",$daten{$provider}->{einwahl}),
			 )->pack(qw(-side left));

  foreach $i (5,15,30,60)
  {
    $kost{$provider}[$i] = sprintf("%.1d",$daten{$provider}->{einwahl}+$kostenlabel{$provider}*$i);
    $w_nebeneinander->Label(
			    -width => 5,
			    -textvariable => \$kost{$provider}[$i],
			   )->pack(qw(-side left));
  }
}


$w_frame->Radiobutton(
		      -text     => "Werktag",
		      -variable => \$feiertag,
		      -relief   => 'flat',
		      -value    => $FALSE,
		      -command  => \&KostenNeuBerechnung,
		     )->pack(-side => 'top', -pady => '2', -anchor => 'w');
$w_frame->Radiobutton(
		      -text     => "Wochenende/Feiertag",
		      -variable => \$feiertag,
		      -relief   => 'flat',
		      -value    => $TRUE,
		      -command  => \&KostenNeuBerechnung,
		     )->pack(-side => 'top', -pady => '2', -anchor => 'w');


$w_frame->Label(
		-text => '-' x 23,
	       )->pack;
$w_frame->Button(
		 -text    => 'Verbindung beenden',
		 -command => \&ppp_off,
		)->pack;
$w->geometry($geometry);

$w->bind('<q>' => [$w => 'destroy']);

# Die angezeigten Kosten auf den aktuellen Stand bringen
$w->after($aktualisierung, \&KostenNeuBerechnung);


MainLoop;


######################################################################
### Unterprogramme
######################################################################

sub start_ppp
{
  my $provider = shift;

  if ($debug)
  {
    # Altes LOG-File wegschicken
    system("cat /tmp/ppp.log | mail -s ppp.log root");
    system('date > /tmp/ppp.log');
    chmod 0666, '/tmp/ppp.log'; # Für alle schreibbar

    system("xterm -geometry 80x24+216+15 -e bash -c \"sudo $ppp $provider 2>&1 | tee --append /tmp/ppp.log ; echo Fenster schließen mit Enter...; read\"");

    system('date >> /tmp/ppp.log');
  }
  else
  {
    system("xterm -geometry 80x24+216+15 -e bash -c \"sudo $ppp $provider ; echo Fenster schließen mit Enter...; read\"");
  }
}


sub info
{
  my $provider = shift;

  system("xterm -geometry +0+0 -e bash -c \"cat $konfigdir/$provider/info.txt ; read\"");
}


sub ppp_off
{
  system("xterm -geometry +0+0 -e bash -c \"sudo $pppoff; echo Fenster schließen mit Enter...; read\"");
}


sub Kosten
{
  # Einlesen und Berechnung der Kosten
  # Parameter: Providername
  # Return:    Kosten in Ct./Min.

  my $provider = shift;
  my $file = "$konfigdir/$provider/kosten.txt";
  my $error = 'Err:Kost';
  my $zeit;
  my $kosten;

  return $error unless -r $file;

  my $fh = FileHandle->new();
  open($fh, $file);

  my $zeile = <$fh>;
  unless ($zeile =~ /^Einwahl\s+([\d\.]+)$/)
  {
    warn "Die Datei '$file' beginnt nicht mit 'Einwahl' in der ersten Zeile!\n";
    $daten{$provider}->{einwahl} = 0;
  }
  else
  {
    $daten{$provider}->{einwahl} = $1;
    $zeile = <$fh>;
  }

  unless ($zeile =~ /Werktags/i)
  {
    warn "Die Datei '$file' hat in der zweiten Zeile nicht 'Werktags' stehen!\n";
    return $error;
  }
  # Werte für Werktage einlesen
  while(<$fh>)
  {
    last if /Wochenende/i;

    /^\s*(\d+)\s*:\s*(\d+[,.]*\d*)/;
    $zeit   = $1;
    $kosten = $2;
    $kosten =~ s/,/./g;
    $daten{$provider}->{werktags}->{$zeit} = $kosten;
  }

  # Werte für Wochenende einlesen
  while(<$fh>)
  {
    /^\s*(\d+)\s*:\s*(\d+[,.]*\d*)/;
    $zeit   = $1;
    $kosten = $2;
    $kosten =~ s/,/./g;
    $daten{$provider}->{wochenende}->{$zeit} = $kosten;
  }
  return ZeitRechnung($provider);
}


sub ZeitRechnung
{
  # Kostenberechnung
  # Parameter: Providername
  # Return:    Kosten in Ct./Min.

  my $error = 'Err:Zeit';
  my $provider  = shift;

  my $stunde    = (localtime())[2];
  my $wochentag = (localtime())[6];

  if ( ($wochentag == 6) || ($wochentag == 0) || $feiertag )
  {
    return $daten{$provider}->{wochenende}->{$stunde} || $error;
  }
  else
  {
    return $daten{$provider}->{werktags}->{$stunde} || $error;
  }
}


sub KostenNeuBerechnung
{
  # Zeigt die Kosten aktualisiert an
  # Parameter: -
  # Return:    -

  my $provider;
  foreach $provider (keys %kostenlabel)
  {
    $kostenlabel{$provider} = ZeitRechnung($provider);

    # Die Rechenbeispiele mit Einwahlgebühr aktualisieren
    foreach $i (5,15,30,60)
    {
      $kost{$provider}[$i] = sprintf("%.1d",$daten{$provider}->{einwahl}+$kostenlabel{$provider}*$i);
    }

  }

  $w->after($aktualisierung, \&KostenNeuBerechnung);
}
