#!/usr/bin/perl 
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
  if 0;
$0 =~ s/^.*?(\w+)[\.\w+]*$/$1/;

use strict;
use warnings;

use Getopt::Long qw(:config gnu_getopt);
use Pod::Usage;
use File::Copy;
use File::Slurp;

my $old_args = join ' ', @ARGV;

my $upstream_url = "http://ftp.se.debian.org/debian";
my $excito_url = "http://update.excito.org/";

my %distributions = (
    'claire' => 1,
    'marielle' => 1,
    'estelle' => 1,
);

my %snapshotable = (
	'marielle' => 1
);

my %upstream_archives = (
    'claire' => 'upstream_etch_forclaire',
    'estelle' => 'upstream_etch_forestelle',
    'marielle' => 'upstream_etch',
);

my %upstream_archives_raliases = (
    'claire' => 'upstream_stable_forclaire',
    'estelle' => 'upstream_stable_forestelle',
    'marielle' => 'upstream_stable',
);

# sources can contain both codename and aliases
my %aliases = (
    'unstable' => 'claire',
    'testing' => 'estelle',
    'stable' => 'marielle',
);

# reverse aliases, needed for preferences
my %raliases = map { $aliases{$_} => $_ } keys %aliases;

my $distribution;

my $upstream = 0;
my $version = 0;
my $source = 0;
my $contrib = 0;
my $nonfree = 0;
my $help = 0;
my $man = 0;
my $experimental = 0;

my $result = GetOptions(
    "upstream|u" => \$upstream,
    "source|s" => \$source,
	"version|v=s" => \$version,
    "experimental|e" => \$experimental,
    "nonfree|n" => \$nonfree,
    "contrib|c" => \$contrib,
    "help|h" => \$help,
    "man|m" => \$man,
) or pod2usage(2);

pod2usage(0) if $help;
pod2usage(-exitstatus => 0, -verbose =>2) if $man;

pod2usage("No distribution given.") unless scalar @ARGV;



my @sources_list;

my @preferences;
push @preferences, "# BUBBA|TWO apt sources.list";
push @preferences, "#";
push @preferences, "# Generated by $0 $old_args";
push @preferences, "#";

push @sources_list, "# BUBBA|TWO apt sources.list";
push @sources_list, "#";
push @sources_list, "# Generated by $0 $old_args";
push @sources_list, "#";
push @sources_list, "# vim: ft=debsources";

if( $upstream ) {
    my @suits = ("main");
    push @suits, 'non-free' if $nonfree;
    push @suits, 'contrib' if $contrib;

    push @sources_list, "deb $upstream_url etch " . join( ' ', @suits );
    push @sources_list, "deb-src $upstream_url etch " . join( ' ', @suits ) if $source;

    push @preferences, "Package: *\nPin:\n release o=Debian, a=stable, c=main\nPin-Priority: 500\n";
    push @preferences, "Package: *\nPin:\n release o=Debian, a=stable, c=contrib\nPin-Priority: 400\n" if $contrib;
    push @preferences, "Package: *\nPin:\n release o=Debian, a=stable, c=non-free\nPin-Priority: 300\n" if $nonfree;
}
foreach my $distribution ( @ARGV ) {
    unless( defined $distributions{$distribution} ) {
        if( defined $aliases{$distribution} ) {
            $distribution = $aliases{$distribution};
        } else {
            pod2usage("Distribution '$distribution' is not valid.")
        }
    }
	my $real_distribution = $distribution;
	my $real_upstream = $upstream_archives{$distribution};

	if( $version && $snapshotable{$distribution} ) {
		$real_distribution .= "/snapshots/$version";
		$real_upstream .= "/snapshots/$version";
	}
    push @sources_list, "deb $excito_url experimental main" if $experimental;
    push @sources_list, "deb-src $excito_url experimental main" if $experimental and $source;

    push @sources_list, "deb $excito_url $real_distribution main";
    push @sources_list, "deb-src $excito_url $real_distribution main" if $source;
    push @preferences, "Package: *\nPin:\n release o=Excito, a=$raliases{$distribution},\n origin=\"update.excito.org\"\nPin-Priority: 999\n";

    push @sources_list, "deb $excito_url $real_upstream main";
    push @sources_list, "deb-src $excito_url $real_upstream main" if $source;
    push @preferences, "Package: *\nPin:\n release o=Excito, a=$upstream_archives_raliases{$distribution},\n origin=\"update.excito.org\"\nPin-Priority: 600\n";
}

move('/etc/apt/sources.list', '/etc/apt/sources.list.bkup') or die "couldn't move /etc/apt/sources.list: $!";
write_file( '/etc/apt/sources.list', join "\n", @sources_list ) or die "couldn't write to /etc/apt/sources.list: $!";

move('/etc/apt/preferences', '/etc/apt/preferences.bkup') or die "couldn't move /etc/apt/preferences: $!";
write_file( '/etc/apt/preferences', join "\n", @preferences ) or die "couldn't write to /etc/apt/preferences: $!";

__END__

=head1 NAME

change_distribution - change current distribution

=head1 SYNOPSIS

change_distribution [options] I<distribution> ...

 Options:
   --upstream, -u           include upstream in sources.list
   --source, -s             include source packages in sources.list
   --nonfree, -n            include upstream non free sources
   --contrib, -c            include upstream contrib sources
   --help, -h               show brief help
   --man, -m                display manual

=head1 EXAMPLES

change_distribution claire # changes distribution to claire

change_distribution claire estelle # changes distribution to claire and estelle

change_distribution claire --upstream --source --nonfree --contrib # changes distribution to claire with full upstream and source
change_distribution -usnc claire # same, but using short options

change_distribution marielle --upstream # changes distribution to stable default layout
=cut

