#!/usr/bin/env perl

# Copyright (C) 2017-2018 Continuent Ltd. All rights reserved.

use warnings;
use strict;
use Data::Dumper;
use Getopt::Long;
use IO::File;

my $opt_outfile = 'tungsten.ini';
my $opt_append = 0;

my $blocks = [];
my $sections = {};

GetOptions(
    "filename=s" => \$opt_outfile,
    "append" => \$opt_append,
    );

sub identandformat
{
    my ($fragment) = @_;

    my $service = undef;
    my $host = undef;

    if ($fragment =~ m{tools/tpm (configure|install|update) ([a-z_]+)})
    {
        $service = $2;
    }

    if ($fragment =~ m/--hosts=(.*)\s+\\/)
    {
        $host = $1;
        $fragment =~ s/--hosts=(.*)\s+\\//mg;
    }

    if (!defined($service))
    {
        die "Couldn't find a servicename\n";
    }

    my $fragmentasini = $fragment;
    $fragmentasini =~ s{tools/tpm (configure|install|update) ([a-z_]+)}{}msg;
    $fragmentasini =~ s/\s*\\\s*$//msg;
    $fragmentasini =~ s/^\s*--//msg;

    if (defined($host))
    {
        my @hostlist = split(/,/,$host);

        foreach my $hostname (@hostlist)
        {
            $sections->{sprintf('%s@%s',$service,$hostname)} = $fragmentasini;
        }
    }
    else
    {
        $sections->{$service} = $fragmentasini;
    }
}

sub dumpini
{
    my @rawini = ();

    foreach my $block (sort keys %{$sections})
    {
        push(@rawini,"[$block]");
        push(@rawini,"$sections->{$block}");
    }

    my $modeopts = "+>";
    $modeopts = ">>" if ($opt_append);

    my $writetgt = new IO::File($opt_outfile,$modeopts) or die "Couldn't create $opt_outfile: $!\n";
    $writetgt->print(join("\n",@rawini),"\n");
    $writetgt->close();
}

sub parsesrc
{
    my $staging = '';

    while(<STDIN>)
    {
        if (($_ =~ m/tpm/) &&
            ($staging =~ m/tpm/))
        {
            push(@{$blocks},$staging);
            $staging = '';
        }

        $staging .= $_;
    }
    if ($staging =~ m/tpm/)
    {
        push(@{$blocks},$staging);
        $staging = '';
    }

}

parsesrc();
foreach my $mainblock (@{$blocks})
{
    identandformat($mainblock);
}
dumpini();
