#!/usr/bin/env perl

# bin/buildmod - Module builder.
# Copyright (C) 2010-2011 Xelhua Development Group, et al.
# This program is free software; rights to this code are stated in doc/LICENSE.
use 5.010_000;
use strict;
use warnings;
use English qw(-no_match_vars);
use FindBin qw($Bin);
use Pod::Html;
use Pod::Man;
our $Bin = $Bin;

our $VERSION = 1.00;

# Get module parameter.
if (!defined $ARGV[0]) {
    say 'Not enough parameters. Usage: buildmod <module>';
    exit;
}
my $module = $ARGV[0];

# Set full path.
my $type = 0;
my $modulep;
if (-e "$Bin/../modules/$module.pm") {
    $modulep = "$Bin/../modules/$module.pm";
    $type = 1;
}
else {
    if (-e "$Bin/../modules/$module/Buildfile") {
        $modulep = "$Bin/../modules/$module/Buildfile";
        $type = 2;
    }
    else {
        say 'No such module '.$module;
        exit;
    }
}

my $data;
if ($type == 1) {
    open my $FHM, '<', $modulep;
    my @BUF = <$FHM>;
    close $FHM;

    foreach my $line (@BUF) {
        $line =~ s/(\r|\n)//g;
        
        if ($line =~ m/^# build: /sm) {
            $data = substr $line, 9;
        }
    }

    if (!defined $data) {
        say 'No build line found in '.$module.'.pm. Aborting.';
        exit;
    }
}
elsif ($type == 2) {
    open my $FHM, '<', $modulep;
    my @BUF = <$FHM>;
    close $FHM;

    foreach my $line (@BUF) {
        $line =~ s/(\r|\n)//g;
        
        $data .= $line;
    }
    
    if (!defined $data) {
        say 'No build datafound in '.$module.'/Buildfile. Aborting.';
        exit;
    }
    else {
        $data = substr $data, 1;
    }
}

# Start build.
my @pars = split ' ', $data;
my $die = 0;

say 'Building '.$module.'.....';

foreach (@pars) {
    my ($opt, $val) = split m/[=]/;

    given ($opt) {
        when ('cpan') {
            say 'Checking for required CPAN modules.....'; print $RS;
            my @vals = split ',', $val;
            my $res = 0;
            foreach my $cpanmod (@vals) {
                $res = eval('require '.$cpanmod.'; 1;');
                say '    '.$cpanmod.': '.(($res) ? 'Found' : 'Not Found');
                if (!$res) { $die = 1; }
            }
            print $RS;
            
            if ($die) { say 'Failed to build '.$module.'.'; exit; }
        }
        when ('perl') {
            print 'Checking Perl version..... '.$PERL_VERSION.' - ';
            if ($] < $val) { $die = 1; }
            say (($die) ? 'Not OK' : 'OK');
            if ($die) { say 'Failed to build '.$module.'.'; exit; }
        }
    }
}

# Generate documentation.
my $got_end = 0;
open my $FMPH, '<', $modulep;
my @MPBUF = <$FMPH>;
close $FMPH;

say 'Generating documentation.....';
my $podbuf;
foreach my $line (@MPBUF) {
    if (!defined $line) { $line = ' '; }
    $line =~ s/(\r|\n)//g;

    if ($line eq '__END__') {
        $got_end = 1;
    }

    if ($got_end and $line ne '__END__') {
        $podbuf .= $line."\n";
    }
}

# Create the autodoc/ dir if it doesn't exist.
if (!-d "$Bin/../autodoc") {
    mkdir "$Bin/../autodoc";
}

# Save to POD file in autodoc/
open my $FMPNH, '>', "$Bin/../autodoc/$module.pod";
print {$FMPNH} $podbuf;
close $FMPNH;

# Create HTML.
pod2html("--infile=$Bin/../autodoc/$module.pod", "--outfile=$Bin/../autodoc/$module.html");
# Create *roff.
my $manifier = Pod::Man->new();
$manifier->parse_from_file("$Bin/../autodoc/$module.pod", "$Bin/../autodoc/$module.1");

print $RS;
say 'Done.';

# vim: set ai sw=4 ts=4:
