#!/usr/bin/perl

use strict;

unless (@ARGV == 2) {
   die "$0 <Input VCF Filename> <Output CSV Filename>";
}

my %columns;
my @ordered_columns;
my $column_count = 0;
my @spreadsheet;

open IN, $ARGV[0] or die $!;
open OUT, ">$ARGV[1]" or die $!;
my $row = {};
while (my $line = <IN>) {
   $line =~ s/\s+$//;
   if ($line =~ /^BEGIN/i) {
      process_row($row);
      $row = {};
   }
   if ($line =~ /^([^:]+):(.*)$/) {
      my $key = $1;
      my $value = $2;
      # parse the lame-ass telephone syntax
      if ($key =~ /^TEL\;/i) {
	 my @crap = split (/=/, $key);
	 $key = "TEL-" . $crap[$#crap];
      }
      # parse the lame-ass address syntax
      if ($key =~ /^ADR\;/i) {
	 my @crap = split (/=/, $key);
	 $key = "ADR-" . $crap[$#crap];
      }
      # parse the lame-ass email syntax
      if ($key =~ /^EMAIL\;/i) {
	 my @crap = split (/=/, $key);
	 $key = "EMAIL-" . $crap[$#crap];
      }
      # split name out
      if ($key =~ /^n$/i) {
	 my @name = split (/;/, $value);
	 $value = "";
	 my @special_keys = qw(LastName FirstName MiddleName);
	 for (my $i=0; $i<@special_keys; $i++) {
	    if (defined $name[$i]) {
	       $row->{$special_keys[$i]} = $name[$i];
	    }
	 }
	 $key = "FullName";
	 $value = "$name[1] $name[0]"; 
      }
      next if ($key =~ /^PHOTO/i);
      next if ($key =~ /^LABEL/i);
      next if ($key =~ /EVOLUTION/i);
      $value =~ s/[\\\']//g;
      $row->{$key} = $value;
   }
}
close IN;

print OUT '"' . join ('","', @ordered_columns) . "\"\n";
my $num_cols = scalar(@ordered_columns);
foreach my $row (@spreadsheet) {
   while (scalar (@$row) < $num_cols) {
      push @$row, "";
   }
   print OUT '"' . join ('","', @$row) . "\"\n";
}
close OUT;
exit (0);

sub process_row($) {

   my $vcard = shift;

   print "Processing Entry " . scalar (@spreadsheet) . " ... \n";

   my @new_row = ("" x $column_count);
   foreach my $key (keys %$vcard) {
      unless (defined $columns{$key}) {
	 $columns{$key} = $column_count;
	 push @ordered_columns, $key;
	 $column_count++;
      }
      $new_row[$columns{$key}] = $vcard->{$key};
   }

   push @spreadsheet, \@new_row;

   return undef;
}
