#!/usr/bin/perl
#
# Author:  Petter Reinholdtsen
# Date:    2007-02-10
# License: GNU Public License v2
#
# Dump selected part of the member database

use strict;
use warnings;

BEGIN {
    # Add script location to include path
    my @p = split(m%/%, $0); pop @p; push @INC, join("/", @p);
}

use Getopt::Std;
use medlemsliste;

sub help {
    print <<EOF;
Usage: $0 [-dFk] [-f <filename>]
  -f <filename>  read member database from <filename>
  -n <number>    print all info about <number>
  -N <YYYY-MM-DD> List address of all new members since date
  -e             print email addresses (default is names)
  -E             print name and email addresses (default is names)
  -P             print post address
  -t             add telephone numbers to the post address list (-P)
  -m             limit list to members
  -M             limit list to non-members
  -p             limit list to persons
  -F             limit list to firm members
  -i             limit list to those with the 'info' flag set
  -I             limit list to those without the 'info' flag set
  -l             limit list to those paying the membership fee
  -L             limit list to those not paying the membership fee
  -a             limit list to those witout email address
  -b             limit list to those wanting their membership to be public (HTML fragment)
  -d             enable debug output
  -h             display this help text
EOF
    exit 1;
}

my $thisyear = current_membership_period();

my @personclasses =('Medlem under bedrift',
                    'Personlig medlem uten USENIX',
                    'Personlig medlem',
                    'Studentmedlemsskap',
                    'Studenter',
                    'Studentmedlem uten USENIX',
                    'Æresmedlem');

my %opts;
getopts("abf:n:eEmMN:pPFiIdhlLt", \%opts) || help();
my $debug = $opts{d};

help() if ($opts{h});

load_memberslist($opts{f} || "medlemsliste.csv", \&process_entry);

sub get_address {
    my ($indent, $memberinfo) = @_;
    my $str;
    for my $field (qw(Address1 Address2 Address3)) {
        $str .= $indent.$memberinfo->{$field}."\n" if $memberinfo->{$field};
    }
    if (!defined $memberinfo->{PostOffice}) {
        $str .= $indent . "[adresse mangler]\n";
    } else {
    $str .= $indent . $memberinfo->{PostCode}." ".$memberinfo->{PostOffice}."\n";
    }
}

sub process_entry {
    my $memberinforef = shift;
    return if ($opts{n} && $memberinforef->{'CustomerNo'} != $opts{n});
    return if ($opts{m} && ! $memberinforef->{'ZUsrMedlemstatus'});
    return if ($opts{M} && $memberinforef->{'ZUsrMedlemstatus'});
    return if ($opts{N} && $memberinforef->{'ZUsrInnmeldtDato'} lt $opts{N});
    return if ($opts{a} && $memberinforef->{'EmailAddress'});
    return if ($opts{F} &&
               "FIRMAMEDLEM" ne $memberinforef->{'ZUsrMedlemstatus'});
    return if ($opts{i} && (! $memberinforef->{'Informasjon'} ||
               $memberinforef->{'Informasjon'} == 0));
    return if ($opts{I} && ($memberinforef->{'Informasjon'} ||
               $memberinforef->{'Informasjon'} == 1));
    return if ($opts{p} && ! is_person($memberinforef) );
    return if ($opts{b} && ! defined $memberinforef->{'MembershipPublicURL'});

    my $paid = (($memberinforef->{ZBetaltTil} || "") ge $thisyear);
    return if ($opts{l} && !$paid);
    return if ($opts{L} && $paid);

    my $key;
    if ($opts{E}) {
        my @n = split(" ", $memberinforef->{"Name"});
        push(@n, shift @n);
        print(join(" ", @n,
                   $memberinforef->{"CustomerNo"},
                   "<".$memberinforef->{"EmailAddress"}.">"), "\n")
            if ($memberinforef->{"EmailAddress"});
    } elsif ($opts{e}) {
        print $memberinforef->{"EmailAddress"},"\n"
            if ($memberinforef->{"EmailAddress"});
    } elsif ($opts{b}) {
        my $url = undef;
        $url = $memberinforef->{"MembershipPublicURL"}
        if ($memberinforef->{"MembershipPublicURL"} &&
            'uri:' ne $memberinforef->{"MembershipPublicURL"});
        print '<br>';
        if ($url) {
            print "<a href=\"" . $memberinforef->{"MembershipPublicURL"},"\">"
        }
        print $memberinforef->{"Name"} if ($memberinforef->{"Name"});
        if ($url) {
            print "</a>\n";
        } else {
            print "\n";
        }
    } else {
        print $memberinforef->{"Name"} if ($memberinforef->{"Name"});
        my $betalt = $memberinforef->{ZBetaltTil} || '[aldri]';
        print " (sist betalt for periode $betalt)" if $opts{L};
        print "\n";
    }

    if ($opts{P}) {
        print get_address("", $memberinforef);
        if ($opts{t}) {
            my @nums;
            for my $tag (qw(MobileTelephone Telephone)) {
                push @nums, $memberinforef->{$tag} if ($memberinforef->{$tag});
            }
            print "Tlf: ", join(" ", @nums), "\n" if (@nums);
        }
        print "\n";
    }

    # Option -n implies full dump of one record
    if ($opts{n}) {
       my $k;
       my $v;
       while ( ($k,$v) = each %$memberinforef ) {
         $v = "" unless defined $v;
         printf "%22s  =>  \"%s\"\n", $k, $v;
       }
    }
}

sub is_person {
    my $memberinforef = shift;
    my $memberclass = $memberinforef->{'ZUsrMedlemstatus'};
    return grep(m/^$memberclass$/, @personclasses);
}
