#!/usr/bin/env perl
# Copyright (C) 2011 Igalia S.L.
# Copyright (C) 2012 Intel Corporation
# Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
# Copyright (C) 2016 Canon Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

use warnings;
use FindBin;
use lib $FindBin::Bin;
use webkitdirs;
use Getopt::Long qw(:config pass_through);
use XML::LibXML;

my $platform = "";
$platform = "gtk" if isGtk();
$platform = "wpe" if isWPE();

if (!$platform) {
    die "No platform specified for " . basename($0) .". Use --gtk or --wpe.\n";
}

my $wipeOnChange = $ENV{JHBUILD_WIPE_ON_CHANGE} // 1;
my $force = 0;
my $release = 0;
my $debug = 0;

GetOptions(
    'wipe-on-change!' => \$wipeOnChange,
    'force' => \$force,
    'release' => \$release,
    'debug' => \$debug
);

sub getJhbuildIncludedFilePaths
{
    my $jhbuildFile = shift;
    die "Can't find file $jhbuildFile" if ! -e $jhbuildFile;
    my $dom = XML::LibXML->load_xml(location => $jhbuildFile);
    my @includes;

    foreach my $includeFile ($dom->findnodes('/moduleset/include/@href')) {
        push(@includes, $includeFile->to_literal());
    }
    return @includes;
}

sub getMD5HashForFile($)
{
    my $file = shift;

    open(FILE_CONTENTS, $file);

    my $contents = "";
    while (<FILE_CONTENTS>) {
        $contents .= $_;
    }

    close(FILE_CONTENTS);

    return md5_hex($contents);
}

sub jhbuildConfigurationCheckFile
{
    my $file = shift;
    my $path = join('/', getJhbuildPath(), $platform, $file . '.md5sum');
    if (! -e $path) {
        return 1;
    }

    # Get the md5 sum of the file we're testing, look in the right platform directory.
    my $actualFile = join('/', sourceDir(), 'Tools', $platform, $file);
    my $currentSum = getMD5HashForFile($actualFile);

    # Get our previous record.
    open(PREVIOUS_MD5, $path);
    chomp(my $previousSum = <PREVIOUS_MD5>);
    close(PREVIOUS_MD5);

    if ($previousSum ne $currentSum) {
        return 1;
    }
}

sub jhbuildModulesetNameChanged()
{
    my $jhBuildModulesetNameFile = join('/', getJhbuildPath(), $platform, 'moduleset.name');
    my $previousModulesetName;
    open(my $FH, '<', $jhBuildModulesetNameFile) or return 1;
    {
        local $/; # localized slurp mode
        $previousModulesetName = <$FH>;
    }
    close($FH);
    return $previousModulesetName ne getJhbuildModulesetName();
}

sub jhbuildConfigurationChanged()
{
    my $jhbuildMain = join('/', sourceDir(), 'Tools', $platform, getJhbuildModulesetName());
    my @jhbuildFiles = ('jhbuildrc', getJhbuildModulesetName());
    push(@jhbuildFiles, getJhbuildIncludedFilePaths($jhbuildMain));

    foreach my $file (@jhbuildFiles) {
        if (jhbuildConfigurationCheckFile($file)) {
            return 1;
        }
    }
    return jhbuildModulesetNameChanged();
}

sub saveMd5File
{
    my $file = shift;
    my $path = realpath(dirname(join('/', getJhbuildPath(), $platform, $file)));
    (-d $path) || mkpath $path;

    $path = join('/', getJhbuildPath(), $platform);
    my $source = join('/', sourceDir(), "Tools", $platform, $file);
    my $destination = join('/', $path, $file);
    open(SUM, ">$destination" . ".md5sum");
    print SUM getMD5HashForFile($source);
    close(SUM);
}

sub saveJhbuildMd5() {
    # Save md5sum for jhbuild-related files.saveJhbuildMd5();
    my $jhbuildPath = getJhbuildPath();
    my $jhbuildMain = join('/', sourceDir(), 'Tools', $platform, getJhbuildModulesetName());
    my @jhbuildFiles = ('jhbuildrc', getJhbuildModulesetName());
    push(@jhbuildFiles, getJhbuildIncludedFilePaths($jhbuildMain));

    (-d $jhbuildPath) || mkpath $jhbuildPath;
    foreach my $file (@jhbuildFiles) {
        saveMd5File($file);
    }
}

sub saveJhbuildModulesetName() {
    my $jhBuildPlatformDir = join('/', getJhbuildPath(), $platform);
    (-d $jhBuildPlatformDir) || mkpath $jhBuildPlatformDir;
    my $jhBuildModulesetNameFile = join('/', $jhBuildPlatformDir, 'moduleset.name');
    open(FH, '>', $jhBuildModulesetNameFile);
    print FH getJhbuildModulesetName();
    close(FH);
}

sub saveJhbuildConfig() {
    saveJhbuildMd5();
    saveJhbuildModulesetName();
}

sub deleteJhbuildMd5() {
    my $jhbuildPath = getJhbuildPath();
    if (!-d $jhbuildPath) {
        return;
    }

    my $jhbuildMain = join('/', sourceDir(), 'Tools', $platform, getJhbuildModulesetName());
    my @jhbuildFiles = ('jhbuildrc', getJhbuildModulesetName());
    push(@jhbuildFiles, getJhbuildIncludedFilePaths($jhbuildMain));

    foreach my $file (@jhbuildFiles) {
        my $md5File = join('/', $jhbuildPath, $platform, $file) . ".md5sum";
        unlink($md5File) if -e $md5File;
    }
}

sub deleteJhbuildModulesetName() {
    my $jhBuildModulesetNameFile = join('/', jhbuildPath, $platform, 'moduleset.name');
    unlink($jhBuildModulesetNameFile) if -e $jhBuildModulesetNameFile;
}

sub deleteJhbuildConfig() {
    deleteJhbuildMd5();
    deleteJhbuildModulesetName();
}

sub runJhbuild
{
    my $command = shift;
    my @jhbuildArgs = ("./jhbuild-wrapper", "--".$platform, $command);
    push(@jhbuildArgs, @ARGV[0..$#ARGV]);
    return system(@jhbuildArgs);
}

sub cleanJhbuild()
{
    # If the configuration changed, dependencies may have been removed.
    # Since we lack a granular way of uninstalling those we wipe out the
    # jhbuild root and start from scratch.
    my $jhbuildPath = getJhbuildPath();
    if (system("rm -rf $jhbuildPath/Root") ne 0) {
        die "Cleaning jhbuild root failed!";
    }

    if (system("rm -rf $jhbuildPath/Source") ne 0) {
        die "Cleaning jhbuild sources failed!";
    }

    system("rm -rf $jhbuildPath/Build");
}

delete $ENV{AR_FLAGS} if exists $ENV{AR_FLAGS};

chdir(relativeScriptsDir() . "/../jhbuild") or die $!;

my %prettyPlatform = ( "gtk" => "GTK+", "wpe" => "WPE" );

if (!$force && !jhbuildConfigurationChanged()) {
    print $prettyPlatform{$platform} . " port dependencies are already up to date\n";
    exit 0;
}

if ($wipeOnChange && -e getJhbuildPath()) {
    cleanJhbuild();
}

print "Updating " . $prettyPlatform{$platform} . " port dependencies using jhbuild...\n";
if (runJhbuild("build") == 0) {
    saveJhbuildConfig();
} else {
    deleteJhbuildConfig();
    die "Failed to build " . $prettyPlatform{$platform} . " port dependencies with jhbuild\n";
}
