#!/usr/bin/env perl

use Cwd;
use strict;
use JSON;

my $TMPDIR;
my $version = "";
my $final_version;

my $original_arguments=join(" ", @ARGV);

sub print_log
{
    print TESTRESULTSLOG (@_);
}

sub print_log_err
{
    print TESTRESULTSLOG (@_);
    print STDERR (@_);
}

sub usage {
    print STDERR "$0: usage\n";
    print STDERR "$0 [-v version] result1.tar[.gz] ...\n";
    print STDERR "$0: you called it with the arguments:\n";
    print STDERR "$0 $original_arguments\n";
}

sub make_tempdir()
{
    my $dirno = 1;
    $TMPDIR = "TMP$dirno";
    while ( -f $TMPDIR or -d $TMPDIR ) {
        ++$dirno;
        $TMPDIR = "TMP$dirno";
    }
    mkdir($TMPDIR,0770) or die "Cannot create temporary directory $TMPDIR\n";
}

sub reformat_results($)
{
    $_ = shift;
    s/\.tar//;
    my $platform = $_;
#    system("dos2unix ${platform}.txt ${platform}.txt");
    open (PLATFORM_RESULTS,"<${platform}.txt") or return;
    my $line;
    while ( ($line = <PLATFORM_RESULTS>) && /^\s*$/) {
    }
    $_ = $line;
    open (PLATFORM_INFO,">${platform}.info") or return;
    open (PLATFORM_NEW_RESULTS,">${platform}.new_results") or return;
    my $CGAL_VERSION = "-";
    my $LEDA_VERSION = "-";
    my $COMPILER = "-";
    my $OS = "-";
    my $TESTER_NAME = "-";
    my $TESTER_ADDRESS = "-";
    my $GMP = "-";
    my $MPFR = "-";
    my $ZLIB = "-";
    my $OPENGL = "-";
    my $BOOST = "-";
    my $QT = "-";
    my $CMAKE = "no";
    my $TPL = "TPL:";
    my @third_party_libs = ();
    my ($LDFLAGS,$CXXFLAGS) = ("", "");
    while (! /^------/) {
        if(/^\s*$/) {
            goto NEXT;
        }
        if(/^-- USING CMake version: ([\w\.-]+)/) {
            $CMAKE = $1;
        }
        if (/^CGAL_VERSION\s+([\w\.-]+)/) {
            $CGAL_VERSION = $1;
        }
        if (/LEDA_VERSION = '([^']+)'/) {
            $LEDA_VERSION="$1";
        }
        if (/LEDAWIN_VERSION = '([^']+)'/) {
            $LEDA_VERSION="$LEDA_VERSION+win";
        }
        if (/COMPILER_VERSION = '([^']+)'/) {
            $COMPILER = $1;
        }
        if (/-- Operating system: (.*)/) {
            $OS = $1;
        }
        if (/^TESTER_NAME\s+(.*)$/) {
            $TESTER_NAME = $1;
        }
        if (/^TESTER_ADDRESS\s+(.*)$/) {
            $TESTER_ADDRESS = $1;
        }
        if (/MPFR_VERSION = '([^']+)'/) {
            $MPFR="$1";
        }
        if (/ZLIB_VERSION = '([^']+)'/) {
            $ZLIB="$1";
        }
        if (/OPENGL_VERSION = '([^']+)'/) {
            $OPENGL="$1";
        }
        if (/GMP_VERSION = '([^']+)'/) {
            $GMP="$1";
        }
        if (/GMPXX_VERSION = '([^']+)'/) {
            $GMP="$GMP+gmpxx";
        }
        if (/QT_VERSION = '([^']+)'/) {
            $QT="$1";
        }
        if (/QT4_VERSION = '([^']+)'/) {
            $QT="$1";
        }
        if (/Qt5_VERSION = '([^']+)'/) {
            $QT="$1";
        }
        if (/Qt6_VERSION = '([^']+)'/) {
            $QT="$1";
        }
        if (/BOOST_VERSION = '([^']+)'/) {
            $BOOST="$1";
        }
#	if (/BOOST_THREAD_VERSION = '([^']+)'/) {
#	    $BOOST="$BOOST+thread";
#	}
# 	if (/BOOST_PROGRAM_OPTIONS_VERSION = '([^']+)'/) {
# 	    $BOOST="$BOOST+program_options";
# 	}
#	if (/BOOST_BIMAP_VERSION = '([^']+)'/) {
#	    $BOOST="$BOOST+bimap";
#	}
        if (/USING +CXXFLAGS = '([^']*)'/ && !$CXXFLAGS) {
            $CXXFLAGS="$CXXFLAGS $1";
        }
        if (/USING +LDFLAGS = '([^']*)'/) {
            $LDFLAGS="$LDFLAGS $1";
        }
#        if(/^CGAL_TEST_PLATFORM /) {
#            # should be the last one of the header
#            last;
#        }
#        if(! /^[A-Z][a-z]/ ) {
#            # the header is finished
#            print PLATFORM_NEW_RESULTS $_;
#            last;
#        }
    if (/^-- Third-party library ([^[:space:]]+) (.+)$/) {
        $TPL = "$TPL $1 $2,";
        push @third_party_libs, { name => $1, version => $2 };
    }
NEXT:	if(! ($_= <PLATFORM_RESULTS>)) {
            # should never happen!!
            last;
        }
    }
    while (<PLATFORM_RESULTS>) {
        print PLATFORM_NEW_RESULTS $_;
    }
    rename("${platform}.new_results","${platform}.txt") or die "cannot rename!";
    my $platform_info = { 
        "cgal_version" => $CGAL_VERSION,
        "compiler" => $COMPILER,
        "operating_system" => $OS,
        "tester_name" => $TESTER_NAME,
        "tester_address" => $TESTER_ADDRESS,
        "CMake_version" => $CMAKE,
        "Boost_version" => $BOOST,
        "MPFR_version" => $MPFR,
        "GMP_version" => $GMP,
        "Qt_version" => $QT,
        "LEDA_version" => $LEDA_VERSION,
        "CXXFLAGS" => $CXXFLAGS,
        "LDFLAGS" => $LDFLAGS,
        "third_party_libs" => \@third_party_libs
    };
    open PLATFORM_JSON , ">${platform}.json" or die "cannot open ${platform}.json";
    print PLATFORM_JSON  JSON->new->utf8->pretty->encode($platform_info);
    close PLATFORM_JSON;
    print PLATFORM_INFO <<"EOF";
$CGAL_VERSION
$COMPILER
$OS
$TESTER_NAME
$TESTER_ADDRESS
$CMAKE
$BOOST
$MPFR
$GMP
$QT
$LEDA_VERSION
$CXXFLAGS
$LDFLAGS
$TPL
EOF
    close(PLATFORM_INFO);
    close(PLATFORM_RESULTS);
    close(PLATFORM_NEW_RESULTS);
    $final_version="CGAL-$CGAL_VERSION";
    if ($version
        && $version ne "CGAL-$CGAL_VERSION"
        && ($version !~ /^CGAL-${CGAL_VERSION}-Ic?-[\d]+$/)) {
        die "Wrong version in $platform: $CGAL_VERSION instead of $version.\n";
    }
}

sub one_archive($)
{
    my $archive = shift;
    if (! -f $archive) {
        print STDERR "$archive is not a valid filename\n";
        return 0;
    }
    if ( $archive =~ m/\.gz$/ ) {
        system("gunzip", "$archive") == 0 or return 0;
        $archive =~ s/\.gz$//;
    }
    if ( $archive =~ m/.*\.tgz$/ ) {
        system("gunzip", "$archive") == 0 or return 0;
        $archive =~ s/\.tgz$/.tar/;
    }
    if ( $archive !~ /\.tar$/) {
        print STDERR "$0: $archive not a tar file\n";
        return 0;
    }
    make_tempdir();
    rename("$archive","$TMPDIR/$archive") or die "cannot rename(\"$archive\",\"$TMPDIR/$archive\")";
    chdir("$TMPDIR") or die "cannot chdir";
    system("gtar", "xf", "$archive") == 0 or die "cannot untar $archive";
    unlink($archive);

    reformat_results($archive);
    system('gzip',glob("*/*")) == 0 or die "cannot gzip (while processing $archive)";
    system('chmod','-R','a+r,og+w','.') == 0 or die "cannot chmod";
    system('tar', 'cf', "../$archive", glob("*")) == 0 or die "cannot tar";
    chdir('..') or die;
    system('rm', '-rf', "$TMPDIR")== 0 or die "cannot rm -rf";
    return 1;
}

sub all_archives() {
    my $archive;
    foreach $archive (@ARGV) {
        if (one_archive($archive)) {
            my $date=`date`;
            chop $date;
            print_log("$final_version : $archive successfully reformatted. [ $date ]\n");
        } else {
            print_log_err("$final_version : Could not reformat $archive\n");
        }
    }
}

if ($#ARGV < 0) {
    usage;
    exit 1;
}

if ($ARGV[0] eq "-v") {
    shift;
    $version = shift;
}

if ($#ARGV < 0) {
    usage;
    exit 1;
}

open (TESTRESULTSLOG, ">>../test_results.log")
    or die "Could not open test_results.log\n";
all_archives();
close (TESTRESULTSLOG);
exit 0;
