#!/usr/bin/perl

$REVISION = '$Id: RegToRDF,v 1.3 2004/06/08 06:51:01 eric Exp $ ';

use strict;

#BEGIN {unshift@INC,('../../..');}
use W3C::Registration::Registration;
package RegToRDF;

use W3C::Registration::Registration;
use W3C::Rdf::ObjectDB;
use W3C::Util::Exception;
use CGI;

use W3C::Util::Properties;
my $properties = new W3C::Util::Properties('../../../Conf/registration.prop');
my $OldReg = new W3C::Registration::Registration('formFields', $properties);
#my $RdfProperties = new W3C::Util::Properties('../Conf/rdf.prop');
#my $RdfDB = new W3C::Rdf::ObjectDB({-errorHandler => undef, -lazyReification => 1, -properties => $RdfProperties});
#my $NewRegDB = new W3C::Registration::RdfReg('formFields', $properties, $RdfDB);
my $Cgi = new CGI({});

use vars qw($RdfNS $RegNS 
	    $MeetingNameBase $MeetingTypeBase 
	    $FieldNameBase $FieldTypeBase $FieldReqBase 
	    $LocalFieldNameBase $LocalNamespace
	    $RegUserBase $Header $Footer);
$RdfNS = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
$RegNS = 'http://www.w3.org/schema/registrationV1/';
$MeetingNameBase = $RegNS.'meetingName/';
$MeetingTypeBase = $RegNS.'meetingType/';
$FieldNameBase = $RegNS.'fieldsByName/';
$FieldTypeBase = $RegNS.'fieldType/';
$FieldReqBase = $RegNS.'fieldRequired/';
$LocalFieldNameBase = $RegNS.'localFields/';
$LocalNamespace = 'local:';
$RegUserBase = $RegNS.'users/byId/';
$Header = <<EOHEADER;
<?xml version="1.0"?>
<rdf:RDF
 xmlns:rdf="$RdfNS"
 xmlns:reg="$RegNS">
EOHEADER
    ;
$Footer = <<EOFOOTER;
</rdf:RDF>
EOFOOTER
    ;

my $migrator = new RegToRDF($OldReg, undef, $Cgi); # , $NewRegDB);
eval {
    $migrator->migrate(\@ARGV);
}; if ($@) {if (my $ex = &catch('W3C::Util::Exception')) {
	$ex->printStackTrace;
	exit;
    } else {
	die $@;
    }}

sub new {
    my ($proto, $old, $new, $cgi) = @_;
    my $class = ref($proto) || $proto;
    my $self = {};
    bless ($self, $class);
    $self->{OLD} = $old;
    $self->{CGI} = $cgi;
#    $self->{NEW} = $new;
    return $self;
}

sub migrate {
    my ($self, $argv) = @_;
    my (@meetings, %fields);
    $self->{OLD}->executeArrayQuery(\@meetings, 'SELECT id,name,descrip,start,end,cutoff,blurb,tail,end_blurb,cc,contact,replyTo,type FROM tableList'); # where id=2');
    my $monitor = $self->open('>/dev/tty');
#    my $rdfOut = $self->open('>/dev/null');
    my $rdfOut = $self->open('>/usr/local/httpd/WWW/Systems/Code/W3C/Registration/bin/regImport.rdf');
    print $rdfOut $Header;
    foreach my $meeting (@meetings) {
	my $escaped;
	my $meetingUri = $MeetingNameBase.$meeting->[1];
	print $rdfOut "   <reg:Meeting rdf:resource=\"$meetingUri\">\n";
	print $rdfOut "      <reg:tableName>$meeting->[1]</reg:tableName><reg:tableDescrip>$meeting->[2]</reg:tableDescrip>\n";
	print $rdfOut "      <reg:startDate>$meeting->[3]</reg:startDate><reg:endDate>$meeting->[4]</reg:endDate><reg:cutoffDate>$meeting->[5]</reg:cutoffDate>\n";
	print $rdfOut "      <reg:topBlurb>$meeting->[6]</reg:topBlurb><reg:bottomBlurb>$meeting->[8]</reg:bottomBlurb>\n";
	$escaped = $self->{CGI}->escapeHTML($meeting->[7]);
	print $rdfOut "      <reg:tail>$escaped</reg:tail>\n";
	print $rdfOut "      <reg:meetingType rdf:resource=\"$MeetingTypeBase$meeting->[12]\"/>\n";
	foreach my $contact (split(',', $meeting->[9])) {print $rdfOut "      <reg::cc>$contact</reg:cc>\n"}
	foreach my $contact (split(',', $meeting->[10])) {print $rdfOut "      <reg::contact>$contact</reg:contact>\n"}
	foreach my $contact (split(',', $meeting->[11])) {print $rdfOut "      <reg::replyTo>$contact</reg:replyTo>\n"}

	my @formFields;
	$self->{OLD}->executeArrayQuery(\@formFields, 'SELECT meeting,name,type,req,markup,seqNo,input,extra FROM formFields WHERE meeting='.$meeting->[0]);
	print $rdfOut "      <reg:fieldSet>\n";
	print $rdfOut "         <rdf:Bag>\n";
	my %fieldURIsByName;
	my @names = ();
	foreach my $formField (@formFields) {
	    print $rdfOut "            <rdf:li>\n";
	    my $name = $formField->[1];
#	    my $fieldUri = $meetingUri.'/'.$name;
	    my ($fieldUri, $fieldNamespace);
	    if ($name && $name ne 'tail' && 
		!($name eq '-' && $meeting->[1] eq 'tableList') && 
		!($name eq 'formSource' && $meeting->[1] eq 'tableList') && 
		!($meeting->[1] eq 'WCAGMar2000' && ($name eq 'EO' || 
						     $name eq 'ig' || 
						     $name eq 'AU'))) {
		$fieldUri = $LocalFieldNameBase.$name;
		$fieldNamespace = $LocalNamespace.$name;
		push (@names, $name);
	    } else {
		$fieldUri = $FieldNameBase.$name;
		$fieldNamespace = 'reg:'.$name;
	    }
	    $fieldURIsByName{$name} = [$fieldUri, $fieldNamespace];
	    print $rdfOut "               <reg:Field rdf:resource=\"$fieldUri\">\n";
	    print $rdfOut "                  <reg:fieldName>$name</reg:fieldName><reg:ff_seqNo>$formField->[5]</reg:ff_seqNo>\n";
	    print $rdfOut "                  <reg:fieldType rdf:resource=\"$FieldTypeBase$formField->[2]\"/>\n";
	    print $rdfOut "                  <reg:fieldRequired rdf:resource=\"$FieldReqBase$formField->[3]\"/>\n";
	    $escaped = $self->{CGI}->escapeHTML($formField->[4]);
	    print $rdfOut "                  <reg:fieldMarkup>$escaped</reg:fieldMarkup>\n";
	    $escaped = $self->{CGI}->escapeHTML($formField->[6]);
	    print $rdfOut "                  <reg:fieldInput>$escaped</reg:fieldInput>\n";
	    print $rdfOut "               </reg:Field>\n";
	    print $rdfOut "            </rdf:li>\n";
	}
	print $rdfOut "         </rdf:Bag>\n";
	print $rdfOut "      </reg:fieldSet>\n";
	print $rdfOut "   </reg:Meeting>\n";
	my @rows;
	$self->{OLD}->executeArrayQuery(\@rows, 'SELECT '.join (',', ('id', @names)).' FROM '.$meeting->[1]);
#	print $monitor $meeting->[1].': '.join (',', sort @names)."\n";
	if ($meeting->[1] ne 'users' && $meeting->[1] ne 'tableList') {
	    foreach my $name (@names) {
		push (@{$fields{$name}}, $meeting->[1]);
	    }
	}
	foreach my $row (@rows) {
	    my $userId = shift @$row;
	    print $rdfOut "   <rdf:Description rdf:resource=\"$RegUserBase$userId\">\n";
#	    print $rdfOut "      <reg:hasUserId>$userId</reg:hasUserId>\n";
	    print $rdfOut "      <reg:registers>\n";
	    print $rdfOut "         <reg:Registration>\n";
	    foreach my $name (@names) {
		my $fieldDatum = shift @$row;
		my ($fieldUri, $fieldNamespace) = @{$fieldURIsByName{$name}};
		print $rdfOut "            <$fieldNamespace>$fieldDatum</$fieldNamespace>\n";
	    }
	    print $rdfOut "         </reg:Registers>\n";
	    print $rdfOut "      </reg:registers>\n";
	}
    }

    foreach my $field (sort {@{$fields{$a}} <=> @{$fields{$b}}} keys %fields) {
	print $monitor @{$fields{$field}}.' '.$field.': '.join (' ', @{$fields{$field}})."\n";
    }
    
    my @rows;
    $self->{OLD}->executeArrayQuery(\@rows, 'SELECT id,family,given,auth,title,org,addr1,addr2,city,state,postalCode,country,email,phone,fax,URL,last FROM users limit 2');
    foreach my $row (@rows) {
	my $userId = shift @$row;
	print $rdfOut "   <reg:User rdf:resource=\"$RegUserBase$userId\">\n";
#	print $rdfOut "      <reg:hasUserId>$userId</reg:hasUserId>\n";
	print $rdfOut "      <reg:userFamily>$row->[1]</reg:userFamily><reg:userGiven>$row->[2]</reg:userGiven><reg:userTitle>$row->[4]</reg:userTitle>\n";
	print $rdfOut "      <reg:userAuth>$row->[3]</reg:userAuth>\n";
	print $rdfOut "      <reg:userOrg>$row->[5]</reg:userOrg>\n";
	print $rdfOut "      <reg:userAddr1>$row->[6]</reg:userAddr1><reg:userAddr2>$row->[7]</reg:userAddr2>\n";
	print $rdfOut "      <reg:userCity>$row->[8]</reg:userCity><reg:userState>$row->[9]</reg:userState>\n";
	print $rdfOut "      <reg:userPostalCode>$row->[10]</reg:userPostalCode><reg:userCountry>$row->[11]</reg:userCountry>\n";
	print $rdfOut "      <reg:userEmail rdf:resource=\"mailto:$row->[12]\"/><reg:userURL rdf:resource=\"mailto:$row->[15]\"/>\n";
	print $rdfOut "      <reg:userphone>$row->[13]</reg:userPhone><reg:userFax>$row->[14]</reg:userFax>\n";
	print $rdfOut "   </reg:User>\n";
    }

    print $rdfOut $Footer;
    $self->{OLD}->disconnect;
#    $self->{NEW}->disconnect;
}

sub open ($) {
    my ($self, $toOpen) = @_;
    local *HANDLE;
    open(HANDLE, $toOpen) || &throw(new W3C::Util::NoSuchFileException(-file => $toOpen));
    return *HANDLE;
}

