#!/usr/bin/perl

use lib './../lib';

package Member_db;

use strict;
use DBI;

sub new {
    my $self = {};
    bless $self;
}

sub DESTORY {
    my $self = shift;
    $self->close;
}

sub open {

    my $self = shift;

    if ($self->{handle}) {
        $self->{handle} = undef unless ($self->{handle}->ping);
    }

    $self->{handle} = 
        DBI->connect("DBI:Pg:dbname=jusdb;host=192.168.1.103;port=5432", 'jusdb')
        unless ($self->{handle});

    $self->{handle};

}

sub close {
    my $self = shift;

    $self->{handle}->disconnect if ($self->{handle});
    $self->{handle} = undef;

}

sub nextval {

    my ($self, $seq_name) = @_;

    my $sql = 'select nextval(?)';

    my $handle = $self->open;
    $sql = $handle->prepare($sql);
    $sql->execute($seq_name);
    my $nextval = $sql->fetchrow_hashref->{nextval};
    $sql->finish;

    $nextval;

}

sub insert_db {

    my ($self, $form, $seq) = @_;

    my $record;

    my (@keys, @vals);
    push @keys, 'number';
    push @vals, $seq;

    push @keys, 'submit_date';
    push @vals, scalar localtime;

    map { push @keys, $_; push @vals, $form->{$_} }
         qw / type email title name name_roman organization organization_roman
              division postal_code address1 address2 address3 tel tel_ex fax
              contact_name contact_name_roman contact_postal_code
              contact_address1 contact_address2 contact_address3 contact_organization
              contact_division contact_tel contact_tel_ex contact_fax
         /;

    map { push @keys, $_; push @vals, $form->{$_} + 0 }
         qw / 
              contact_enable fee_count
              dm_enable
         /;

    my $sql = sprintf "insert into newmembers (%s) values(%s)", 
           join( ',', @keys),
           '?,' x $#vals . '?';

    my $handle= $self->open;
    $sql = $handle->prepare($sql);
    $sql->execute(@vals);
    $sql->finish;

    $seq;

}


package main;

use strict;
use Template;
use Jcode;
use CGI;

use jus_session;

sub form_default {

    my ($form) = @_;

    my @date = (localtime)[5,4];
    $date[0] += 1900;
    $date[0]-- if ($date[1] < 2);

    $form->{receipt_none} = 'on';
    $form->{receipt_title} = sprintf "%s 年度年会費および登録手数料として", $date[0];
    $form->{receipt_name}  = '(本人名義宛て)';
    $form->{year} = $date[0];
    $form->{fee_count} = 1;
    $form->{XXstep} = 0;
    $form->{XXexpire} = time + 1800;
    $form->{XXmagic} = time;
    $form;
}

sub insert_db {

    my $form = shift;
    my $db = new Member_db;

    $form->{$_} = $ENV{$_} foreach( qw/HTTP_USER_AGENT REMOTE_ADDR REMOTE_HOST/ );

    my $seq = $db->nextval('newmember_seq');
    $form->{XXnewmbmer_seq} = $seq;
    $db->insert_db($form, $seq);

}

sub chk_form {

    my $query = shift;
    my @req = $query->param('XXREQUISITE');
    my @messge;
    my $j = Jcode->new;

    foreach(@req) {
        my ($key, $mesg) = split ':';
        push @messge, $j->set($mesg,'sjis')->euc unless ($query->param($key));
    }

    join ', ', @messge;

}

sub report_mail {

    my $form = shift;
    my $sendmail = '/usr/sbin/sendmail -f office@jus.or.jp -- newmember-bywww@jus.or.jp ';
#    my $sendmail = '/usr/sbin/sendmail -f office@jus.or.jp -- ryuchi@jus.or.jp ';

    $form->{email} =~ tr/`'"//d;
    $sendmail .= $form->{email};
    my $template  = new Template( INCLUDE_PATH => 'templates', );

    my $mail_body;
    $template->process(
       "newmember.report.txt",
       { form => $form},
       \$mail_body,
    );

    $mail_body = Jcode->new($mail_body, 'euc')->jis;
    my $MAIL;
    open $MAIL, "| $sendmail";

    my $header =<< '__MAIL_HEADER__';
From: office@jus.or.jp
To: office@jus.or.jp
Subject: Newmember Regist by Web interface
Mime-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=iso-2022-jp

__MAIL_HEADER__

    print $MAIL $header;
    print $MAIL $mail_body;
    print $MAIL $template->error;
    close $MAIL;
}

my $query     = new CGI;
my $session   = new jus_session ($query);
my $session_id = $session->init;

my $form = $session->hash('form');

if ($form->{XXexpire} < time ) {
    $form = form_default;
} else {
    $form->{XXexpire} = time + 1800;
    if ( $query->param('XXmagic') eq $form->{XXmagic} ) {

        $form->{XXstep}++ if ($query->param('XXsubmit_NEXT') and !($form->{XXerror} = chk_form $query));
        $form->{XXstep}-- if ($form->{XXstep} > 0 and $query->param('XXsubmit_BACK'));
        $form->{XXexpore} = time + 1800;
#        $form->{XXstep} = -1 if ($form->{XXfinal});

        map {$form->{$_} = 
             Jcode->new($query->param($_), 'sjis')->euc} 
             grep { !/^XX/ }
             $query->param;

        my $final = $query->param('XXsubmit_FINAL');
        if ($final == $form->{XXstep}) {
            $form->{number} = insert_db $form;
            $form->{XXfinal} = 1;
            report_mail $form;
            $form->{XXexpire} = 0;
        }
    }
    $form->{XXmagic} = time;
}
$session->hash('form', $form);

my $template  = new Template( INCLUDE_PATH => 'templates', );

my $html;
$template->process(
    sprintf ("newmember.%d.txt.%s", $form->{XXstep}, $session->ua_type),
    { form => $form, session_id => $session_id},
    \$html
);

print Jcode->new($html, 'euc')->sjis;
print $template->error;

