use Modern::Perl;
package Orbital::Transfer::PackageManager::APT;
# ABSTRACT: Package manager for apt-based systems
$Orbital::Transfer::PackageManager::APT::VERSION = '0.001';
use Mu;
use Orbital::Transfer::Common::Setup;
use aliased 'Orbital::Transfer::Runnable';
use Orbital::Transfer::PackageManager::dpkg;
use List::AllUtils qw(all);
use File::Which;

classmethod loadable() {
	all {
		defined which($_)
	} qw(apt-cache apt-get);
}

lazy dpkg => method() {
	Orbital::Transfer::PackageManager::dpkg->new(
		runner => $self->runner,
	);
};

method installed_version( $package ) {
	$self->dpkg->installed_version( $package );
}

method installable_versions( $package ) {
	try {
		my ($show_output) = $self->runner->capture(
			Runnable->new(
				command => [ qw(apt-cache show), $package->name ],
			)
		);

		my @package_info = split "\n\n", $show_output;

		map { /^Version: (\S+)$/ms } @package_info;
	} catch {
		die "apt-cache: Unable to locate package @{[ $package->name ]}";
	};
}

method are_all_installed( @packages ) {
	try {
		all { $self->installed_version( $_ ) } @packages;
	} catch { 0 };
}

method install_packages_command( @package ) {
	Runnable->new(
		command => [
			qw(apt-get install -y --no-install-recommends),
			map { $_->name } @package
		],
		admin_privilege => 1,
	);
}

with qw(Orbital::Transfer::Role::HasRunner);

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Orbital::Transfer::PackageManager::APT - Package manager for apt-based systems

=head1 VERSION

version 0.001

=head1 AUTHOR

Zakariyya Mughal <zmughal@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by Zakariyya Mughal.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut