#!/usr/bin/perl
##################################################
# Jap.pm - Mike Schilli, 2001 (m@perlmeister.com)
##################################################
use warnings;
use strict;

package Jap;

use DB_File;

my  %DB;
my  $VERSION  = "1.0";
my  $DBF  = "/etc/scripts/jap.dat";
my  %CMDS = map { $_ => \&$_ } 
                           qw(help quiz add dump);
##################################################
sub shell {
##################################################
    $|++;
    print "*** Welcome to jap $VERSION ***\n";

    tie %DB, "DB_File", $DBF, O_CREAT|O_RDWR, 0666 
        or die "Cannot open $DBF";

    while(<STDIN>) {
        chop; 
        my($cmd, $params) = split ' ', $_, 2;

        next unless defined $cmd;
        last if $cmd eq "exit";      # Ende?

        if(exists $CMDS{$cmd}) {
            $CMDS{$cmd}->($params);  # Kommando
        } else {
            print "Unknown command '$cmd'\n";
        }
    }

    untie %DB;      # Hash und DB synchronisieren
    print "*** Thanks for using jap.\n";
}

##################################################
sub help {                        # Hilfe ausgeben
##################################################
    print <<EOT;
Commands:
    ADD german - japanese (add a new expression)
    QUIZ (run a quiz)
    EXIT (exit)
EOT
}

##################################################
sub add {      # Ausdruck zur Datenbank hinzufügen
##################################################
    my $params = shift or (help(), return);
    
    my($ger, $jap) = split /-/, $params, 2;
    if(!defined $ger or ! defined $jap) {
        help();  # Falsch aufgerufen => Hilfe
        return;
    }
    $ger =~ s/^\s+|\s+$//g; # Leerräume am Anfang
    $jap =~ s/^\s+|\s+$//g; # und Ende entfernen
    $DB{$ger} = $jap;       # => in die Datenbank
}

##################################################
sub quiz {      # Japanisch pauken - Abfragestunde
##################################################
    my @keys = keys %DB;

    while(@keys) {
        my $key = splice(@keys, rand @keys, 1);
        print "$key? (Hit Enter)\n";   # Frage
        my $in = <STDIN>;       # Benutzereingabe
        last unless $in =~ /^\s*$/;    # Abbruch?
        print "$DB{$key}\n\n";  # Lösung ausgeben
    }

    print "End of quiz.\n";
}

##################################################
sub dump {              # Datenbankinhalt ausgeben
##################################################
    for my $key (sort keys %DB) {
        print "$key - $DB{$key}\n";
    }
}

1;
