package Greenstone::Package::_apt;

use strict;
use warnings;
use utf8;
use parent 'Greenstone::Package';

# Deb packages expect lists to be comma separated
sub replacement_array {
    my $self = shift;
    my $array = shift;
    return join ", ", @{$array};
}

sub write_function {
    my ($self, $name, @lines) = @_;
    my $file = "$self->{output}/debian/$name";
    print "    - $file\n";
    open my $OUT, '>', $file
        or die "Failed to open $file: $!";
    for my $line (@lines) {
        print $OUT $line, "\n";
    }
    close $OUT;
    chmod 0755, $file;
}

# Add pre/post install/remove hooks
sub add_install {
    my ($self, $name) = @_;
    my $prefix = (defined $name ? "$name." : "");
    exists $self->{config}->{PRE_INSTALL} and
        $self->write_function ("${prefix}preinst", @{$self->{config}->{PRE_INSTALL}});
    exists $self->{config}->{POST_INSTALL} and
        $self->write_function ("${prefix}postinst", @{$self->{config}->{POST_INSTALL}});
    exists $self->{config}->{PRE_REMOVE} and
        $self->write_function ("${prefix}prerm", @{$self->{config}->{PRE_REMOVE}});
    exists $self->{config}->{POST_REMOVE} and
        $self->write_function ("${prefix}postrm", @{$self->{config}->{POST_REMOVE}});
}

# Adds a definition for a package or subpackage
sub add_package_section {
    my ($self, $out) = @_;
    for my $line (
        'Package: %NAME%',
        'Architecture: %ARCHITECTURE%',
        'Homepage: %HOMEPAGE%',
        'Depends: %DEPENDS%',
        'Description: %DESCRIPTION_SHORT%',
        '  %DESCRIPTION%',
        ''
    ) {
        my $copy = $line;
        $self->subst ($copy);
        print $out $copy, "\n";
    }
}

# Adds a definition for files included in a subpackage
sub add_package_files {
    my $self = shift;
    my $file = "$self->{output}/debian/$self->{config}->{NAME}.install";
    print "    - $file\n";
    open my $INSTALL, '>', $file;
    for my $line (@{$self->{config}->{FILES}}) {
        print $INSTALL $line, "\n";
    }
    close $INSTALL;
}

# Handles the apt-specific package generation
sub add_package_impl {
    my ($self, $packages) = @_;
    my $file = "$self->{output}/debian/control";
    print "    - $file\n";
    open my $CONTROL, '>', $file
        or die "Failed to open $file: $!";
    for my $line (
        'Source: %NAME%',
        'Section: java',
        'Priority: optional',
        'Maintainer: %MAINTAINER_NAME% <%MAINTAINER_EMAIL%>',
        'Build-Depends: %MAKEDEPENDS%',
        ''
    ) {
        my $copy = $line;
        $self->subst ($copy);
        print $CONTROL $copy, "\n";
    }
    if (defined $packages) {
        my @names;
        # add main package
        my $root = $self->{config}->{NAME};
        push @names, $self->{config}->{NAME};
        $self->add_install ($self->{config}->{NAME});
        $self->add_package_section ($CONTROL);
        $self->add_package_files;

        my $config = $self->{config};
        # add subpackages
        for my $package (@{$packages}) {
            $package->{NAME} = "$root-$package->{NAME}";
            push @names, $package->{NAME};
            $package->{HOMEPAGE} = $config->{HOMEPAGE};
            $self->{config} = $package;
            $self->add_install ($package->{NAME});
            $self->add_package_section ($CONTROL);
            $self->add_package_files;
        }
        $self->{config} = $config;
        my $rules = "$self->{output}/debian/rules";
        open my $RULES, '>>', $rules
            or die "Failed to open $rules: $!";
        print $RULES "\noverride_dh_gencontrol:\n";
        for my $name (@names) {
            print $RULES "\tdh_gencontrol -p$name\n";
        }
        close $RULES;
    } else {
        $self->add_install;
        $self->add_package_section ($CONTROL);
    }
    close $CONTROL;
}

1;
