package LinuxFocus::SDB;

use strict;
use vars qw ( $VERSION @ISA @EXPORT_OK $doc $article $lang 
              $articleid %dbs @dbids );
use LinuxFocus::DB;

BEGIN {
  require LinuxFocus::DB;

  $VERSION = '0.2';   # 19-08-2000

  @ISA         = qw( Exporter );
  @EXPORT_OK   = qw( &load );

  return 1;
}

sub new {
  my ($class, %args) = @_;

  %dbs = ();
  @dbids = ();

  return bless {}, $class;
}

sub load {
    my ($class, $file, @dummy) = @_;  

    my $db = LinuxFocus::DB->new();
    $db->load($file);
    my $dblang = $db->getDBLang();
    $db->setLang($dblang);
    
    $dbs{$dblang} = $db;
    push (@dbids, $dblang);
}

sub setLang {
    (my $class, $lang) = @_;
}

sub getCurrentMonthID {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    # first db is considered up to date
    my $result = "May2000";
    my $resultcode = "200005";
    foreach my $dbid (@dbids) {
      #print STDERR "Checking current month in $dbid$/";
      my ($temp, $tempcode) = ($dbs{$dbid})->getCurrentMonthID();
      if ($tempcode > $resultcode) {
          $result = $temp;
          $resultcode = $tempcode;
      };
    }
    return $result;
}

sub getMonthIDs {
    my ($class, %args) = @_;
    my ($sort, $limit);
    if (%args) {
      $sort = $args{"sort"} || "asc";
      $limit = $args{"limit"};
    }
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my @result = ();
    foreach my $dbid (@dbids) {
        push(@result, ($dbs{$dbid})->getMonthIDs(%args, raw => "yes"));
    }

    # sort the stuff
    if (defined $sort) {
        @result = sort @result;
        if ($sort eq "asc") {
        } else {
            # assume descending order
            @result = reverse @result;
        }
    } else {
        # assume random order is oke
    }
    # uniq and limit the stuff
    my $counter = 0;
    my $previd = "-1";
    my @final = ();
    foreach my $monthid (@result) {
        my ($sorter, $value) = split('{', $monthid);
        if ($previd ne $value) {
            $counter++;
            if ((!defined $limit) || $counter <= $limit) {
                push(@final, $value);
	    }
            $previd = $value;
        }
    }
    return @final;
}

sub getPersonIDs {
    my ($class, %args) = @_;
    my $limit;
    if (%args) { $limit = $args{"limit"}; };
    my $sort      = $args{"sort"} || "no";
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my @result = ();
    foreach my $dbid (@dbids) {
        push(@result, ($dbs{$dbid})->getPersonIDs(%args, raw => "yes"));
    }

    # sort the stuff
    if (defined $sort) {
        @result = sort @result;
        if ($sort eq "asc") {
        } else {
            # assume descending order
            @result = reverse @result;
        }
    } else {
        # assume random order is oke
    }
    # uniq and limit the stuff
    my $counter = 0;
    my $previd = "-1";
    my @final = ();
    foreach my $id (@result) {
        my ($sorter, $value) = split('{', $id);
        if ($previd ne $value) {
            $counter++;
            if ((!defined $limit) || $counter <= $limit) {
                push(@final, $value);
	    }
            $previd = $value;
        }
    }
    return @final;
}

sub getArticleIDs {
    my ($class, %args) = @_;
    my ($limit, $month, $translated, $to, $from); 
    if (%args) {
      # Use month => "" to get IDs of article in a certain month
      $month = $args{"month"};

      # Use translated => "yes" with either/both to => "" or/and
      #   from => "" to select tranlated articles
      $translated = $args{"translated"};
      $to = $args{"to"};
      $from = $args{"from"};
      
      # general variables
      $limit = $args{"limit"};
    }
    my $sort      = $args{"sort"} || "no";
    my $published = $args{"published"} || "no";
    my $cover     = $args{"coverpages"} || "no";
    my $raw       = $args{"raw"} || "no";
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my @articleIDs = ();
    foreach my $dbid (@dbids) {
        push(@articleIDs, ($dbs{$dbid})->getArticleIDs());
    }
 
    @articleIDs = reverse sort @articleIDs;
    my @temp = ();
    my $previd = "";
    foreach my $id (@articleIDs) {
	if ($id ne $previd) {
	    push (@temp, $id);
	}
        $previd = $id;
    }
    @articleIDs = @temp;

    my %temp = ();
    if (defined $month) {
        foreach my $id (@articleIDs) {
            selectArticle($class, $id);
            #print "selecting $id... ";
            #print getArticleMonthID($class) . " (=? $month)";
            if (getArticleMonthID($class) eq $month) {
                #print " ... selected!$/";
                $temp{$id} = $id;
                #print " temp size: " . scalar(keys %temp) . "$/";
	    } else {
		#print "$/";
	    }
        }
    } elsif (defined $translated && (defined $to || defined $from)) {
        foreach my $id (@articleIDs) { 
            selectArticle($class, $id);
            my $date = "";
            if (defined $to || !defined $from) {
                $date = getArticleTranslationDate($class, to => "$to") || "";
            } elsif (defined $from) {
                $date = getArticleTranslationDate($class, from => "$from") || "";
	    } else {
                $date = getArticleTranslationDate($class, from => "$from",
                                                  to   => "$to") || "";
	    }
            if ($date ne "") {
       	        $temp{"$date$id"} = $id;
	    }
        }
    } else {
        foreach my $id (@articleIDs) {
             $temp{"$id"} = $id;
        }
    }

    # sort the stuff
    my @result = ();
    my @keys = keys %temp;
    #print "temp size: " . scalar(@keys) . "$/";
    if ($sort ne "no") {
        #print "temp size: " . scalar(@keys) . "$/";
        @keys = sort @keys;
        #print "temp size: " . scalar(@keys) . "$/";
        if ($sort eq "desc") {
            #print "temp size: " . scalar(@keys) . "$/";
            @result = reverse @keys;
        }
        #print "temp size: " . scalar(@keys) . "$/";
    } else {
        @result = @keys;
    }
    #print "temp size: " . scalar(@result) . "$/";
    # uniq and limit the stuff
    my $counter = 0;
    $previd = "-1";
    my @final = ();
    #print "Making final selection:$/";
    foreach my $id (@result) {
        #print "cheking key=$id$/";
        if ($previd ne $id) {
            $counter++;
            if ((!defined $limit) || $counter <= $limit) {
                push(@final, $temp{$id});
	    }
            $previd = $id;
        }
    }
    return @final;
}

sub selectArticle {
    my ($class, $artid) = @_;
    die "No article ID given!$/" if (!defined $artid);
    die "No databases loaded!$/" if (scalar @dbids == 0);

    $class->{articleid} = $artid;
    foreach my $dbid (@dbids) {
        ($dbs{$dbid})->selectArticle($artid);
    }
}

sub articleIsPublished {
    my ($class) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = 0;
    foreach my $dbid (reverse @dbids) {
        if (!$result) { 
            $result = ($dbs{$dbid})->articleIsPublished();
	}
    }
    return $result;
}

sub articleIsCover {
    my ($class) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = 0;
    foreach my $dbid (reverse @dbids) {
        if (!$result) { 
            $result = ($dbs{$dbid})->articleIsCover();
	}
    }
    return $result;
}

sub getArticleMonthID {
    my ($class, $olang) = @_;
    $olang = $lang if (!defined $olang);
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleMonthID($olang);
        if ($value  && ($result eq "" || $lang eq $olang)) { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleMonth {
    my ($class, $olang) = @_;
    $olang = $lang if (!defined $olang);
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleMonth($olang);
        if ($value ne "" && $result eq "") { 
            $result = $value;
            return $result if ($olang eq $dbs{$dbid}->getDBLang());
        };
    }
    return $result;
}

sub getArticleTitle {
    my ($class, $olang) = @_;

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTitle($olang);
        if ($value ne "") {             
            $result = $value;
        };
    }
    return $result;
}

sub getIssueRL {
    my ($class, $id, $olang) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getIssueRL($id, $olang);
        if ($value ne "" && 
            ($result eq "" || $lang eq $olang)) { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleRL {
    my ($class, $olang, %args) = @_;
    $olang = $lang if (!defined $olang);
    my $meta = $args{meta};
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleRL($olang, %args);
        if ($value ne "" && 
            ($result eq "" || $lang eq $olang)) { 
            $result = $value;
        };
    }
    if ($result eq "") {
        my $langdir = "";
        my $issuerl = "";
        my $monthid = "";
        foreach my $dbid (reverse @dbids) {
            my $value = ($dbs{$dbid})->getArticleMonthID($olang);
            if ($value ne "" && $monthid eq "") { 
                $monthid = $value;
	    }
	}
        foreach my $dbid (reverse @dbids) {
            my $value = ($dbs{$dbid})->getLanguageDir($olang);
            if ($value ne "" && ($langdir eq "" || $lang eq $olang)) { 
                $langdir = $value;
	    }
            $value = ($dbs{$dbid})->getIssueRL($monthid);
            if ($value ne "" && ($issuerl eq "" || $lang eq $olang)) { 
                $issuerl = $value;
	    }
	}
        if ($meta) {
	    $result = "$langdir/$issuerl/article" . $class->{articleid} . ".meta.shtml";
	} else {
	    $result = "$langdir/$issuerl/article" . $class->{articleid} . ".shtml";
	}
    }
    return $result;
}

sub getArticleThemeID {
    my ($class, $olang) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleThemeID($olang);
        if ($value ne "" && 
            ($result eq "" || $lang eq $olang)) { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleTheme {
    my ($class, $olang) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTheme($olang);
        if ($value ne "" && 
            ($result eq "" || $lang eq $olang)) { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleOriginalLanguage {
    my ($class, $olang) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleOriginalLanguage($olang);
        if ($value ne "" && 
            ($result eq "" || $lang eq $olang)) { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleTranslationDate {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);
    
    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTranslationDate(%args);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleTranslationPerson {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);
    
    my $result = "";    
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTranslationPerson(%args);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}   

sub getArticleTranslationPersonID {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);
    
    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTranslationPersonID(%args);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}   

sub getArticleTranslationPersonEmail {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);
    
    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTranslationPersonEmail(%args);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleTranslationReservationDate {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTranslationReservationDate(%args);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}   

sub getArticleTranslationProofreadDate {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTranslationProofreadDate(%args);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}   

sub getArticleTranslationProofreadPerson {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);
    
    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTranslationProofreadPerson(%args);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}   

sub getArticleTranslationProofreadPersonID {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);
    
    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTranslationProofreadPersonID(%args);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}   

sub getArticleTranslationProofreadPersonEmail {
    my ($class, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);
    
    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleTranslationProofreadPersonEmail(%args);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}   

sub getArticleAuthor {
    my ($class) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleAuthor();
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleAuthorID {
    my ($class) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleAuthorID();
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleAbstract {
    my ($class) = @_;    
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleAbstract();
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getArticleAuthorEmail {
    my ($class) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getArticleAuthorEmail();
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getTheme {
    my ($class, $themeid, $olang) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getTheme($themeid, $olang);
        if ($value ne "" && 
            ($result eq "" || $lang eq $olang)) { 
            $result = $value;
        };
    }
    return $result;
}

sub getMonthName {
    my ($class, $id, $olang) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getMonthName($id, $olang);
        if ($value ne "" && 
            ($result eq "" || $lang eq $olang)) { 
            $result = $value;
        };
    }
    return $result;
}

sub issueIsPublished {
    my ($class, $id) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = 0;
    foreach my $dbid (reverse @dbids) {
        if (!$result) {
            $result = ($dbs{$dbid})->issueIsPublished($id);
	}
        #print STDERR "DEBUG: isPublished: $dbid -> $result$/";
    }
    return $result;
}

sub getPersonEmail {
    my ($class, $id) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getPersonEmail($id);
        if ($value ne "" && $result eq "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getPersonName {
    my ($class, $id) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getPersonName($id);
        if ($value ne "" && $result eq "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getPersonNickname {
    my ($class, $id) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getPersonNickname($id);
        if ($value ne "" && $result eq "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getPersonDescription {
    my ($class, $id) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my $result = "";
    foreach my $dbid (reverse @dbids) {
        my $value = ($dbs{$dbid})->getPersonDescription($id);
        if ($value ne "") { 
            $result = $value;
        };
    }
    return $result;
}

sub getPersonStats {
    my ($class, $id, %args) = @_;
    die "No databases loaded!$/" if (scalar @dbids == 0);

    my %result = ();
    my $translated = 0;
    my $proofread = 0;
    my $written = 0;
    foreach my $dbid (reverse @dbids) {
        my %value = ($dbs{$dbid})->getPersonStats($id, %args);
        $translated += $value{translated};
        $proofread += $value{proofread};
        $written += $value{written};
    }
    $result{written} = $written;
    $result{translated} = $translated;
    $result{proofread} = $proofread;
    return %result;
}

sub getLanguageDir {
    my ($olang) = @_;

    my $result = "English";
    if ($olang eq "nl") {
        $result = "Nederlands";
    } elsif ($olang eq "de") {
        $result = "Deutsch";
    } elsif ($olang eq "es") {
        $result = "Castellano";
    } elsif ($olang eq "fr") {
        $result = "Francais";
    }
    return $result;
}    

1;


