#!/usr/bin/perl
use warnings;
use strict;
use Date::Manip;
use Math::Round;
use File::Copy qw(copy);
# script that runs at 5 after midnight DAILY
# collect previous day's climo and update
# files.

# using global variables ... deal with it.
## Raw Data File
#my $csvdata = "/data/ASOS/csvdata_20210902";
my $csvdata = "/data/ASOS/csvdata";

my $todayFullString;
my $todaysMonth;
my $todaysDayNumber;
my $todaysYear;
my $yesterdayFullString;
my $yesterdaysMonth;
my $yesterdaysDayNumber;
my $yesterdaysYear;
my $yesterdaysFullYear;
my $dailyRain_in;
my $dailyRain_mm;
my @monthObs;
my @yesterdaysObs;
my $midnightObs;
my %midnightHash;
my $monthlyRainSum_mm;
my $monthlyRainSum_in;
my $maxTemperatureC;
my $minTemperatureC;
my $maxTemperatureF;
my $minTemperatureF;
my $maxWindMS;
my $maxWindMPH;
my $maxWindDir;
my $maxTemperatureTime;
my $minTemperatureTime;
my $maxWindTime;
my $maxInfoFile;
my $minInfoFile;
my $maxTempInfo;
my $minTempInfo;
my $maxTempYear;
my $maxTempMonth;
my $maxTempDay;
my $minTempYear;
my $minTempMonth;
my $minTempDay;
my $cumulativeRain;
my $yearRain;
my $systime;
my $prepfile;
my $newrainfile;
my $rainYearTotal;
my %singleOb;
# FILES
my $rainfile;
my $yearfile;
my $outfile;
my $todaysFullYear;
my $missing_wind = 0;
my %MONTHS= (
    '01',  'January',
    '02',  'February',
    '03',  'March',
    '04',  'April',
    '05',  'May',
    '06',  'June',
    '07',  'July',
    '08',  'August',
    '09',  'September',
    '10',  'October',
    '11',  'November',
    '12',  'December',
);

# subroutines
get_todays_date();
get_yesterdays_date();
get_yesterdays_months_data();
get_just_yesterdays_data();
get_midnight_data();
#get_rain_for_the_month();
get_rain_for_the_month_revised();
get_latest_climo_data();
get_existing_climo();
clobber_newspaper_data();
check_and_update_climo();
finishing_operations();

sub get_todays_date{


    $todayFullString = UnixDate('now',"%m/%d/%y");
    $todaysMonth = substr($todayFullString,0,2);
    $todaysDayNumber = substr($todayFullString,3,2);
    $todaysYear = substr($todayFullString,6,2);
    $todaysFullYear = "20" . $todaysYear;  # you have 80 years to fix this   ;-)"
                                            # because I don't plan on working here then.
                                            # and yes I know there are better ways to get te full year
                                            # but then I cant write stupid messages to myself if I do that.
}

sub get_yesterdays_date{

    $yesterdayFullString = UnixDate('yesterday',"%m/%d/%y");
    $yesterdaysMonth = substr($yesterdayFullString,0,2);
    $yesterdaysDayNumber = substr($yesterdayFullString,3,2);
    $yesterdaysYear = substr($yesterdayFullString,6,2);
    $yesterdaysFullYear = "20" . $yesterdaysYear;  # if this script is still running
                                                   # in 80 years .. then someone
                                                    # dropped the ball.
}

sub get_yesterdays_months_data{
    @monthObs = `grep "$yesterdaysMonth/../$yesterdaysYear" $csvdata`; # grab entire month's data
}

sub get_just_yesterdays_data{
    my $greppattern = "DATE,$yesterdaysMonth/$yesterdaysDayNumber/$yesterdaysYear";
    @yesterdaysObs = `grep "$greppattern" $csvdata`;

}
sub get_midnight_data{
    $midnightObs = `grep "TIME,00:00,DATE,$todayFullString" $csvdata`; # grab ONLY midnight TODAY'S data
    chomp $midnightObs;
    my @temp = split(/,/,$midnightObs);
    %midnightHash = @temp;
}
    
#sub get_rain_for_the_month{  # sum up all rain for the month to date
#    $monthlyRainSum_mm = 0;
#   my $line;
#    foreach $line (@monthObs){
#        chomp $line;
#        my @data = split(/,/,$line);
#        if(scalar(@data) == 188){
#             %singleOb = @data;
#            unless (($singleOb{TIME} eq "00:00") or ($singleOb{DATE} eq $todayFullString)){
#                $monthlyRainSum_mm += $singleOb{PRSUM1M};
#            }
#        }
#    }
  
#    $monthlyRainSum_mm += $midnightHash{PRSUM1M}; #this gets any rain that falls in the last minute of the day
#    $monthlyRainSum_in = $monthlyRainSum_mm / 25.4;
    
#}

# commented out above routine since missing data really distorts the rain total
# using the midnight daily rain ob to add to cumulatinve monthly rain
# # of course if midnight ob is missing them I may have to go back to old way
sub get_rain_for_the_month_revised {
   my $cumrainfile = "/home/cws/public_html/climo/1998/$yesterdaysMonth$yesterdaysYear" . "-cumrain.txt";
   open RAIN,"<$cumrainfile" or die "Cannot open cumrain.txt file in revised rain subroutine\n";
   local $/;
   $monthlyRainSum_in = <RAIN>; 
   chomp $monthlyRainSum_in; 
   close RAIN;
   $monthlyRainSum_in += ($midnightHash{PRSUM1D} / 25.4);
}



sub get_latest_climo_data{       # major change to this missing data will
   #$maxTemperatureC = $midnightHash{TAMAX1D};
   #$minTemperatureC = $midnightHash{TAMIN1D};
   #$maxTemperatureF = $maxTemperatureC *(9./5.)+32.;
   #$minTemperatureF = $minTemperatureC *(9./5.)+32.;
   $dailyRain_in = $midnightHash{PRSUM1D}/25.4;
   chomp $dailyRain_in;
   $maxTemperatureC = -999;
   $minTemperatureC = 999.;
   #$dailyRain_mm = 0;
    my $line;
    $maxWindMS = 0;
    foreach $line (@yesterdaysObs){  #Find max wind speed for yesterday
        my @tempdata = split(/,/,$line);
        if(scalar(@tempdata) == 188){
            my %singleOb = @tempdata;
            unless (($singleOb{TIME} eq "00:00") or ($singleOb{TIME} eq "00:01") or ($singleOb{DATE} eq $todayFullString)){
                if($singleOb{WS1MAX2M} eq "/"){
                    $maxWindMS = "Missing";
                    $maxWindMPH = "Missing";
                    $maxWindTime = "Missing";
                    $maxWindDir = "Missing";
                    $missing_wind = 1;
                }
                elsif($singleOb{WS1MAX2M} > $maxWindMS){  # since these are 2 moinute averages, we start at 00:02 to get wind speeds for the day
                    $maxWindMS = $singleOb{WS1MAX2M};
                    $maxWindMPH = $maxWindMS * 2.237;
                    $maxWindTime = $singleOb{TIME};
                    $maxWindDir = $singleOb{WD1AVG2M};
                }
                if($singleOb{TAAVG1M} > $maxTemperatureC){
                    $maxTemperatureC = $singleOb{TAAVG1M};
                    $maxTemperatureTime = $singleOb{TIME};
                
                }
                if($singleOb{TAAVG1M} < $minTemperatureC){
                    $minTemperatureC = $singleOb{TAAVG1M};
                    $minTemperatureTime = $singleOb{TIME};
                    
                }
    #            $dailyRain_mm += $singleOb{PRSUM1M};
            } # end unless singleOb{TIME}
        }
    }
	    
#            $dailyRain_in = $dailyRain_mm / 25.4;
	     
           $maxTemperatureF = $maxTemperatureC *(9./5.)+32.;
          $minTemperatureF = $minTemperatureC * (9./5.)+32.;
	    $minTemperatureF = round($minTemperatureF);
	    $maxTemperatureF = round($maxTemperatureF);
}
  
sub get_existing_climo{
    $rainfile = "/home/cws/public_html/climo/1998/$yesterdaysMonth$yesterdaysYear" . "-cumrain.txt";
    $yearfile = "/home/cws/public_html/climo/1998/$yesterdaysFullYear" . "-cumrain.txt";
    $outfile = "/home/cws/public_html/climo/1998/$yesterdaysMonth$yesterdaysYear" . ".html";
    $maxInfoFile = "/home/cws/public_html/climo/1998/$yesterdaysFullYear" . "-max.txt";
    $minInfoFile = "/home/cws/public_html/climo/1998/$yesterdaysFullYear" . "-min.txt";
    open RAIN,"<$rainfile" or die "Cannot open rain climo file, $rainfile\n";
    {
        local $/;
        $cumulativeRain = <RAIN>;
        chomp $cumulativeRain;
    }
    close(RAIN);
    open YEAR,"<$yearfile" or die "Cannot open year climo file $yearfile\n";
    {
        local $/;
        $yearRain = <YEAR>;
        chomp $yearRain;
    }
    close(YEAR);
    open MAX, "<$maxInfoFile" or die "Cannot open max temp  info file $maxInfoFile\n";
    {
        local $/;
        $maxTempInfo = <MAX>;
        chomp $maxTempInfo;
    }
    close(MAX);
    ($maxTempYear,$maxTempMonth,$maxTempDay) = split(/ +/,$maxTempInfo);
    open MIN,"<$minInfoFile" or die "Cannot open min temp info file $minInfoFile\n";
    {
        local $/;
        $minTempInfo = <MIN>;
        chomp $minTempInfo;
        ($minTempYear,$minTempMonth,$minTempDay) = split(/ +/,$minTempInfo);
    }
    close(MIN);
    
}

sub check_and_update_climo{
    if($maxTemperatureF > $maxTempYear){
        open(YRMAX,">$maxInfoFile");
        print YRMAX "$maxTemperatureF $MONTHS{$yesterdaysMonth} $yesterdaysDayNumber\n";
       #print "YRMAX: $maxTemperatureF $MONTHS{$yesterdaysMonth} $yesterdaysDayNumber\n";
        close YRMAX;            
    }
    if($minTemperatureF < $minTempYear){
        open(YRMIN,">$minInfoFile");
        print YRMIN "$minTemperatureF $MONTHS{$yesterdaysMonth} $yesterdaysDayNumber\n";
       #print "YRMIN:  $maxTemperatureF $MONTHS{$yesterdaysMonth} $yesterdaysDayNumber\n"; 
        close YRMIN;
    }
}

sub finishing_operations{
    open(RAIN,"> $rainfile") or die "Error opening $rainfile\n";;
    printf RAIN "%2.2f\n",$monthlyRainSum_in;
    #printf "RAIN: %2.2f\n",$monthlyRainSum_in;
    close(RAIN);
    open(YEAR,">$yearfile");
    $rainYearTotal = $yearRain + $dailyRain_in;
    printf YEAR "%2.2f\n",$rainYearTotal;
    #printf "YEAR: %2.2f\n",$rainYearTotal;
    close YEAR;
    $maxTemperatureF = round($maxTemperatureF);
    $minTemperatureF = round($minTemperatureF);
    if($missing_wind == 0){
        $maxWindMPH= round($maxWindMPH);
    }
    else{
        $maxWindMPH = "Missing";
    }
    $systime = `date '+%-I:%M%p'`;
    chomp $systime;
    open(OUTPUT,">>$outfile");
    printf OUTPUT "<tr>\n<td align=center>$yesterdaysMonth/$yesterdaysDayNumber</td><td align=center>$maxTemperatureF<br><font size=\"-1\">($maxTemperatureTime)</font></td><td align=center>$minTemperatureF<br><font size=\"-1\">($minTemperatureTime)</font></td><td align=center>$maxWindDir<br><font size=\"-1\">($maxWindTime)</font></td><td align=center>$maxWindMPH<br><font size=\"-1\">($maxWindTime)</font></td><td align=center>%2.2f</td> </tr>\n\n",$dailyRain_in;
    #printf "TO WEB:  " . "<tr>\n<td align=center><b>As of $systime:</b><br>$yesterdaysMonth/$yesterdaysDayNumber</td><td align=center>$maxTemperatureF<br><font size=\"-1\">($maxTemperatureTime)</font></td><td align=center>$minTemperatureF<br><font size=\"-1\">($minTemperatureTime)</font></td><td align=center>$maxWindDir<br><font size=\"-1\">($maxWindTime)</font></td><td align=center>$maxWindMPH<br><font size=\"-1\">($maxWindTime)</font></td><td align=center>%2.2f</td> </tr>\n\n", $dailyRain_in;
    
    
    if($todaysDayNumber eq "01"){
        final_html();
        head_html();
    }
}
 sub final_html{
     printf OUTPUT "<tr>\n<td></td><td></td><td></td><td></td><td><b>Total<br>Rainfall:</b></td><td><b>%2.2f</b></td>\n</tr>\n\n", $monthlyRainSum_in;
     print OUTPUT "</table>\n</center>\n\n";
     print OUTPUT "<p></p>\n";
     printf OUTPUT "<center>\nYear-to-date rainfall: <b>%2.2f in.</b>\n</center>\n\n", $rainYearTotal;
     print OUTPUT "</body>\n</html>";
 }
 

sub head_html {

     $prepfile = "$todaysMonth" . "$todaysYear" . ".html";
     $newrainfile = "$todaysMonth" . "$todaysYear" . "-cumrain.txt";
     

    open(PREPOUT, "> $prepfile");

   
   print PREPOUT "<html>\n<head><title>Monthly Summation of Surface Obs at MU</title></head>\n<body>\n\n";
   print PREPOUT "<center>\n<h1>Daily Summaries for<br>$MONTHS{$todaysMonth} $todaysFullYear</h1>\n\n";
   print PREPOUT "<table border=1 cellpadding=6>\n";
   print PREPOUT "<caption><font size=-1>\n";
   print PREPOUT "All values are calculated midnight to midnight unless \n";
   print PREPOUT "otherwise noted. The times in<br>( )s are the times when \n";
   print PREPOUT "the value occurred.\n";
    print PREPOUT "</font></caption>\n";
   print PREPOUT "<tr>\n";
   print PREPOUT "<th>Date</th><th>Max Temp.<br>(<sup>o</sup>F)</th><th>Min Temp.<br>(<sup>o</sup>F)</th><th>Dir. of<br>Peak Wind<br>(deg.)</th><th>Peak Wind<br>Speed<br>(mph)</th><th>Daily<br>Rainfall<br>(in.)</th>\n</tr>\n\n";

close PREPOUT;
`cp -p $prepfile $prepfile.tmp`;

`echo "0.00" > $newrainfile`;      # Prepare the new monthly rainfall file
`echo "0.00" > $newrainfile.tmp`;  # Prepare the new monthly rainfall.tmp file
}

sub clobber_newspaper_data{
	my $toclean = $outfile;
    my $pattern = "As of";
	my $newfile = "$outfile" . "_new";
	my $line;
	open (OLD,"<$toclean");
	open (NEW,">$newfile");
	my @lines = <OLD>;
	foreach $line (@lines){
    	print NEW $line unless ($line =~ m/$pattern/ );
    	}
    	close (OLD);
    	close (NEW);
        copy $newfile, $toclean;
}
