#!/usr/bin/env perl

use strict;
use warnings;
use v5.10;
use File::Basename;
use utf8;

use ACU::API::Projects;
use ACU::API::Submission;
use ACU::LDAP;
use ACU::Log;
$ACU::Log::log_file = "/var/log/hooks/" . basename($0) . ".log";
use ACU::Process;

my $promo;
my $id_project;
my $repo_login;

# First, extract information, from config then guess from repository adress
if (my $tmp = `git config hooks.promo`) { chomp $tmp; $promo = $tmp; }
if (my $tmp = `git config hooks.idproject`) { chomp $tmp; $id_project = $tmp; }
if (my $tmp = `git config hooks.login`) { chomp $tmp; $repo_login = $tmp; }

$promo = $1 if (!$promo && $ENV{'GL_REPO'} =~ m/([0-9]{4}).*/);
$id_project = $1 if (!$id_project && $ENV{'GL_REPO'} =~ m/.*\/(.*)\//);
$repo_login = $1 if (!$repo_login && $ENV{'GL_REPO'} =~ m/.*\/.*\/(.*)/);

exit(0) if (!$promo || !$id_project || !$repo_login);

for my $ref (@ARGV)
{
    my $tag;
    my $tag_for;
    if ($ref =~ m<^refs/tags/(ACU-(.+))$>)
    {
	$tag = $1;
	$tag_for = $2;
    }
    elsif ($ref =~ m<^refs/tags/(.+)$>)
    {
	$tag = $1;
	$tag_for = $1;
    }
    else {
	next;
    }

    log DEBUG, "Tag $tag ($tag_for) on repository $ENV{GL_REPO} from IP $ENV{'SSH_CLIENT'} updated.";
	
    my $project = get_project_info($tag_for);
	
    # Extract matching tag
    my @rendus = grep {
	exists $_->{vcs} and $_->{vcs}{tag} eq $tag_for;
    } @{ $project->{submissions} };
	
    if (@rendus)
    {
	eval
	{
	    Process::Client::launch("send_git",
				    {
					"year"  => $promo,
					"id"    => $id_project,
					"rendu" => $tag,
					"login" => $repo_login,
#				        "path"  => "ssh://git\@localhost/".$ENV{GL_REPO}, # Optional
				    },
				    undef, # Don't give any file
				    1      # Launch in background
		);
	};
	if ($@)
	{
	    my $err = $@;
	    log DEBUG, "ERROR: ".$err;
	}
	    
	# Send data to API
	my $last_commit = `git log "refs/tags/$tag" -1 --decorate --tags`;
	eval {
	    API::Submission::add($promo, $id_project, $tag_for, $repo_login, $last_commit);
	};
	if ($@)
	{
	    my $err = $@;
	    log DEBUG, "ERROR: ".$err;
	    log DONE, "Tag '$tag' effectué avec succès !";
	}
	else {
	    log DONE, "Tag '$tag' effectué avec succès ! Vérifiez-le sur l'intranet.";
	}
    }
}

exit 0;

sub get_project_info
{
    my $project;
    eval {
	$project = API::Projects::get($id_project, $promo);
    };
    if ($@ or !$project)
    {
	my $err = $@;
	log TRACE, $err;
	log ERROR, "Impossible d'envoyer de tags ; si le problème persiste, passez au laboratoire.";
	exit(1);
    }

    #log TRACE, $project;

    return $project;
}
