#!/usr/bin/perl
#
# Use as is, user assumes all risk, no warranty is expressed or implied. This
# has been rigorously tested but hey, this is Open Source, use at your own risk.
#
# Copyright 2011-2012 Curtis J Blank a.k.a. curtronics dot com
# Subject to GPL License
#
# modified 02-apr-2011 cjb	1. added SolarNoon

use strict;
use Getopt::Std;

	my $Version = "1.0.6";

our( $opt_c, $opt_i, $opt_o, $opt_q, $opt_F);

my $OPTS = "c:i:o:qF";

getopts($OPTS);

my $ConfigFile = $opt_c;
my $DataFile = $opt_i;
my $OutFile = $opt_o;
my $Quiet = $opt_q;
my $forceStatus = $opt_F;	# if Status is NULL force it to [OK] = DANGEROUS!!

if ($ConfigFile eq "") { $ConfigFile = "convertToCSV.conf"; }


open(INFILE, "<$ConfigFile")  || die "Can't open config file \"convertToCSV.conf\": $!";
my @Data = <INFILE>;
close(IFILE);

my @Delim = grep(/Deliminator/,@Data);
@Delim = split /#/, $Delim[0];
@Delim = split /=/, $Delim[0];
my $Delim = $Delim[1];
chomp($Delim);
$Delim =~ s/\s+//g;
if ($Delim eq "") {
    printf stderr "\nCan't determine column deliminator, exiting...\n\n";
    exit 1;
}

if ($DataFile eq "") {
    my @DataFile = grep(/DataFile/,@Data);
    @DataFile = split /#/, $DataFile[0];
    @DataFile = split /=/, $DataFile[0];
    $DataFile = $DataFile[1];
    chomp($DataFile);
    $DataFile =~ s/^\s+//;
    $DataFile =~ s/\s+$//;
    if ($DataFile eq "") {
        printf stderr "\nCan't determine input data file, exiting...\n\n";
        exit 1;
    }
}

if ( ! -e $DataFile) {
    printf stderr "\n$DataFile doesn't seem to exist, exiting...\n\n";
    exit 1;
}

if (-d $DataFile) {
    printf stderr "\n$DataFile appears to be a directory, exiting...\n\n";
    exit 1;
}

my %ColumnName;

my @ColumnList = ("DateTime","Year","Month","Day","Hour","Minute","Second","InsideTemp","InsideHum","OutsideTemp","OutsideHum","WindChill","HeatIndex","SolarRad","ETDay","ForecastIcon","ForecastRule","RainDay","StormRain","IncRain","RainRate","IsRaining","WindDir","WindSpeed","WindRoseDir","Barometer","BaroTrendImage","BaroTrend","Sunrise","Sunset","RunTimeTT","DST","SolarNoon","Status");

my %month;
$month{ "JAN" } = "01";
$month{ "FEB" } = "02";
$month{ "MAR" } = "03";
$month{ "APR" } = "04";
$month{ "MAY" } = "05";
$month{ "JUN" } = "06";
$month{ "JUL" } = "07";
$month{ "AUG" } = "08";
$month{ "SEP" } = "09";
$month{ "OCT" } = "10";
$month{ "NOV" } = "11";
$month{ "DEC" } = "12";

my @Columns = ();
my @Line = ();
my $Line;
foreach $Line (@Data) {
    chomp($Line);
    @Line = split/#/, $Line;
    $Line = $Line[0];
    $Line =~ s/\s+$//;
    if ($Line ne "" && $Line !~ /Deliminator/ && $Line !~ /DataFile/) {
        @Line = split/=/, $Line;
        my $FieldName = $Line[0];
        my $Column = $Line[1];
        $FieldName =~ s/\s+//g;
        $Column =~ s/\s+//g;
        if ($FieldName ne "" && $Column ne "") {
            $ColumnName{ $FieldName } = --$Column;
            push @Columns, " $FieldName ";
        }
    }
}

if (! $Quiet) { printf stderr "\nOpening $DataFile for reading... "; }
open(INFILE, "<$DataFile") || die "Can't open data file ($DataFile): $!";
my @Data = <INFILE>;
close(IFILE);
if (! $Quiet) { printf stderr "Done.\n\n"; }

if ($#Data < 0) {
    printf stderr "Doesn't seem to be any data int $DataFile, exiting...\n\n";
    exit 1;
}

if ($OutFile eq "") { $OutFile = "$DataFile.cvt"; }

my $DateTime = "";
my $Year = "";
my $Month = "";
my $Day = "";
my $Hour = "";
my $Minute = "";
my $Second = "";
my $InsideTemp = "";
my $InsideHum = "";
my $OutsideTemp = "";
my $OutsideHum = "";
my $WindChill = "";
my $HeatIndex = "";
my $SolarRad = "";
my $ETDay = "";
my $ForecastIcon = "";
my $ForecastRule = "";
my $RainDay = "";
my $StormRain = "";
my $IncRain = "";
my $RainRate = "";
my $IsRaining = "";
my $WindDir = "";
my $WindSpeed = "";
my $WindRoseDir = "";
my $Barometer = "";
my $BaroTrendImage = "";
my $BaroTrend = "";
my $Sunrise = "";
my $Sunset = "";
my $RunTimeTT = "";
my $DST = "";
my $SolarNoon = "";
my $Status = "";

if (! $Quiet) { printf stderr "Opening $OutFile for writing... "; }
open(OUTFILE, ">$OutFile") || die "Can't open output file ($OutFile): $!";

my $foundOK = "";
foreach $Line (@Data) {
    chomp($Line);
    $Line =~ /(\[OK\])/;
    $foundOK = $1;
    $Line =~ s/\s+\[OK\]//; 	# prevent it from being picked up as data if in the wrong column
    @Line = split/#/, $Line;
    $Line = $Line[0];
    $Line =~ s/\s+$//;
    if ($Line ne "") {
        @Line = split /$Delim/, $Line;
        if ($ColumnName{ "DateTime" } ne "") { $DateTime = $Line[$ColumnName{ "DateTime" }]; } else { $DateTime = ""; }
        if ($ColumnName{ "Year" } ne "") { $Year = $Line[$ColumnName{ "Year" }]; } else { $Year = ""; }
        if ($ColumnName{ "Month" } ne "") { $Month = $Line[$ColumnName{ "Month" }]; } else { $Month = ""; }
        if ($ColumnName{ "Day" } ne "") { $Day = sprintf( "%02i", $Line[$ColumnName{ "Day" }]); } else { $Day = ""; }
        if ($ColumnName{ "Hour" } ne "") { $Hour = sprintf( "%02i", $Line[$ColumnName{ "Hour" }]); } else { $Hour = ""; }
        if ($ColumnName{ "Minute" } ne "") { $Minute = sprintf( "%02i", $Line[$ColumnName{ "Minute" }]); } else { $Minute = ""; }
        if ($ColumnName{ "Second" } ne "") { $Second = sprintf( "%02i", $Line[$ColumnName{ "Second" }]); } else { $Second = "00"; }
        if ($ColumnName{ "InsideTemp" } ne "") { $InsideTemp = sprintf( "%.1f", $Line[$ColumnName{ "InsideTemp" }]); } else { $InsideTemp = ""; }
        if ($ColumnName{ "InsideHum" } ne "") { $InsideHum = sprintf( "%i", $Line[$ColumnName{ "InsideHum" }]); } else { $InsideHum = ""; }
        if ($ColumnName{ "OutsideTemp" } ne "") { $OutsideTemp = sprintf( "%.1f", $Line[$ColumnName{ "OutsideTemp" }]); } else { $OutsideTemp = ""; }
        if ($ColumnName{ "OutsideHum" } ne "") { $OutsideHum = sprintf( "%i", $Line[$ColumnName{ "OutsideHum" }]); } else { $OutsideHum = ""; }
        if ($ColumnName{ "WindChill" } ne "") { $WindChill = sprintf( "%.1f", $Line[$ColumnName{ "WindChill" }]); } else { $WindChill = ""; }
        if ($ColumnName{ "HeatIndex" } ne "") { $HeatIndex = sprintf( "%.1f", $Line[$ColumnName{ "HeatIndex" }]); } else { $HeatIndex = ""; }
        if ($ColumnName{ "SolarRad" } ne "") { $SolarRad = sprintf( "%i", $Line[$ColumnName{ "SolarRad" }]); } else { $SolarRad = ""; }
        if ($ColumnName{ "ETDay" } ne "") { $ETDay = sprintf( "%.3f", $Line[$ColumnName{ "ETDay" }]); } else { $ETDay = ""; }
        if ($ColumnName{ "ForecastIcon" } ne "") { $ForecastIcon = $Line[$ColumnName{ "ForecastIcon" }]; } else { $ForecastIcon = ""; }
        if ($ColumnName{ "ForecastRule" } ne "") { $ForecastRule = $Line[$ColumnName{ "ForecastRule" }]; } else { $ForecastRule = ""; }
        if ($ColumnName{ "RainDay" } ne "") { $RainDay = sprintf( "%.2f", $Line[$ColumnName{ "RainDay" }]); } else { $RainDay = ""; }
        if ($ColumnName{ "StormRain" } ne "") { $StormRain = sprintf( "%.2f", $Line[$ColumnName{ "StormRain" }]); } else { $StormRain = ""; }
        if ($ColumnName{ "IncRain" } ne "") { $IncRain = sprintf( "%.2f", $Line[$ColumnName{ "IncRain" }]); } else { $IncRain = ""; }
        if ($ColumnName{ "RainRate" } ne "") { $RainRate = sprintf( "%.2f", $Line[$ColumnName{ "RainRate" }]); } else { $RainRate = ""; }
        if ($ColumnName{ "IsRaining" } ne "") { $IsRaining = $Line[$ColumnName{ "IsRaining" }]; } else { $IsRaining = ""; }
        if ($ColumnName{ "WindDir" } ne "") { $WindDir = $Line[$ColumnName{ "WindDir" }]; } else { $WindDir = ""; }
        if ($ColumnName{ "WindSpeed" } ne "") { $WindSpeed = sprintf( "%i", $Line[$ColumnName{ "WindSpeed" }]); } else { $WindSpeed = ""; }
        if ($ColumnName{ "WindRoseDir" } ne "") { $WindRoseDir = $Line[$ColumnName{ "WindRoseDir" }]; } else { $WindRoseDir = ""; }
        if ($ColumnName{ "Barometer" } ne "") { $Barometer = sprintf( "%.3f", $Line[$ColumnName{ "Barometer" }]); } else { $Barometer = ""; }
        if ($ColumnName{ "BaroTrendImage" } ne "") { $BaroTrendImage = $Line[$ColumnName{ "BaroTrendImage" }]; } else { $BaroTrendImage = ""; }
        if ($ColumnName{ "BaroTrend" } ne "") { $BaroTrend = $Line[$ColumnName{ "BaroTrend" }]; } else { $BaroTrend = ""; }
        if ($ColumnName{ "Sunrise" } ne "") { $Sunrise = $Line[$ColumnName{ "Sunrise" }]; } else { $Sunrise = ""; }
        if ($ColumnName{ "Sunset" } ne "") { $Sunset = $Line[$ColumnName{ "Sunset" }]; } else { $Sunset = ""; }
        if ($ColumnName{ "RunTimeTT" } ne "") { $RunTimeTT = $Line[$ColumnName{ "RunTimeTT" }]; } else { $RunTimeTT = ""; }
        if ($ColumnName{ "DST" } ne "") { $DST = $Line[$ColumnName{ "DST" }]; } else { $DST = ""; }
        if ($ColumnName{ "SolarNoon" } ne "") { $SolarNoon = $Line[$ColumnName{ "SolarNoon" }]; } else { $SolarNoon = ""; }
        if ($ColumnName{ "Status" } ne "") { $Status = $Line[$ColumnName{ "Status" }]; } else { $Status = ""; }
        if ($Month =~ /\D+/) {
            $Month = uc $Month;
            $Month = $month{ $Month };
        }
        if ($Status eq "" && $foundOK ne "") { $Status = $foundOK; }
        if ($Status eq "" && $forceStatus) { $Status = "[OK]"; }
        if ($DateTime eq "" && $Year ne "" && $Month ne "" && $Day ne "" && $Hour ne "" && $Minute ne "" ) {
            $DateTime = sprintf "%04i%02i%02i-%02i:%02i", $Year, $Month, $Day, $Hour, $Minute;
        }
        if ($DateTime eq "") {
            printf "\nDateTime unknown, can't proceed, exiting...\n\n";
            exit 1;
        } else {
            printf OUTFILE "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n", "$DateTime","$InsideTemp","$InsideHum","$OutsideTemp","$OutsideHum","$WindChill","$HeatIndex","$SolarRad","$ETDay","$ForecastIcon","$ForecastRule","$RainDay","$StormRain","$IncRain","$RainRate","$IsRaining","$WindDir","$WindSpeed","$WindRoseDir","$Barometer","$BaroTrendImage","$BaroTrend","$Sunrise","$Sunset","$RunTimeTT","$DST","$SolarNoon","$Status";
        }
    }
}
close (OUTFILE);
if (! $Quiet) { printf stderr "Done.\n\n"; }


#
