#!/usr/bin/perl
###########################################################################
# Copyright (C) 2010 Mandriva
#
# Thierry Vignaud <tvignaud@mandriva.com>
# João Victor Duarte Martins <jvictor@mandriva.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License Version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
###########################################################################

BEGIN { unshift @::textdomains, 'mdkonline' }


use lib qw(/usr/lib/libDrakX /usr/lib/libDrakX/drakfirsttime);
use standalone;	# for explanations
use common;
use run_program;
use interactive;
use interactive::gtk;
use mygtk2 qw(gtknew);	# only gtknew, any other stuff would break ugtk2
use ugtk2 qw(:all);
use mdkonline qw($product_id);
use mdkapplet_gui;
use urpm::cfg;
use utf8;

# %product is keyed by product id and it contains the data to add
# restricted media for each product.
my %product = (
    powerpack => { 
	info_url => 'https://my.mandriva.com/powerpack/',
	has_rights => sub {
	    my $profile = shift @_;
	    $profile->{data}{'can-access-restricted-repositories'} eq 'YES';
	},
	media_name => 'Restricted',
        add_medium => \&mdkonline::add_medium_powerpack 
	    
    },
    server => { 
	info_url => 'http://www2.mandriva.com/linux/server/',
	has_rights => sub {
	    my $profile = shift @_;
	    $profile->{data}{groups}{'es5-prod'} or
		$profile->{data}{groups}{'es5-demo'};
	},
	media_name => 'Update',
        add_medium => \&mdkonline::add_medium_enterprise
    },
    extended => {
        info_url => 'https://my.mandriva.com/',
        has_rights => sub {
            my ($profile, $version) = @_;
            return ! ref $profile->{data}{groups}{'ext-maint-' . $version};
        },
        media_name => 'Extended Maintenance',
        add_medium => \&mdkonline::add_medium_extended,
        success_callback => sub {
            mdkonline::read_sys_config();
            $mdkonline::config{EXTENDED_SUPPORT} = bool2yesno(1);
            mdkonline::setVarsInSh($mdkonline::config_file, 
                                   \%mdkonline::config);
        }
    }
    );

# Distribution upgrade version and product
my $up_version;
my $up_product;

# Dialogs title and banner text
my $title = N("Adding an additional package medium");

my $current_apimdv_distro;

# ######################################################################
# Main Program

{
    # Parsing command line arguments.
    my $usage =
	"Usage: $0 [OPTION]... VERSION\n" .
	"Add package medias for VERSION (of current product by default).\n" .
	"\n" .
	"  --rpm-root=PATH          Use PATH as root for rpm\n" .
	"  --urpmi-root=PATH        Use PATH as root for rpm and urpmi\n" .
	"  --product=NAME           Upgrade to VERSION of product named NAME\n";


    foreach (@ARGV) {
	if (/^--(rpm-root|urpmi-root)=(.+)/) {
	    $::rpmdrake_options{$1}[0] = $2;
	}
	elsif (/^--product=(.+)/) {
	    $up_product = lc $1;
	}
	elsif (/^([^-]{2}.+)/) {
	    $up_version = $1;
	}
	else {
	    die $usage;
	}
    }
    $up_version or die $usage;

    # FIXME Couldn't that be automatic called when mdkonline.pm is used?
    $product_id or mdkonline::get_product_id();

    # Product id data should be used in lowercase.
    $up_product ||= lc $product_id->{product};

    # Sanitizes product command line argument.
    unless (exists $product{$up_product}) {
	my $available = join ", ", map { "'$_'" } keys %product;
	$available =~ s/(.+), ([^,]+)/$1 and $2/;
	die N("Supported products are %s, '%s' is not on the list.\n",
	      $available, 
	      $up_product);
    }

    run_authentication_dialog();
    ugtk2::exit(0);
}

sub run_authentication_dialog {
    my $description = N("Please fill in your account ID to add an additional package medium");
    my $extra_info = undef;    # extra widgets for the dialog

    if ($up_product eq 'extended') {

        # Setup extra_info widgets for extended product...
        my ($url, $extmaint_end, $desktop_update_end, $basic_update_end)
            = get_extended_maintenance_data();
        if (my $err = $@) {
            interactive->vnew->ask_warn(
                N("Error"), 
                N("Failure while retrieving distributions list:") . "\n$err"
            );
            return;
        }
        $extra_info
            = [ gtknew('Label_Left', 
                       text_markup =>
                       join("\n\n",
                            #-PO: Here '%s' will be a localized date (eg:
                            #     "2009/11/28" in english but "28/11/2009"
                            #     for brazil or "28 Nov. "2009" for
                            #     french:
                            N("Mandriva provides 12 months of desktop updates (until %s) and 18 months of base updates (up to the %s) for distributions.",
                              mdkapplet_gui::iso8601_date_to_locale(
                                  $desktop_update_end),
                              mdkapplet_gui::iso8601_date_to_locale(
                                  $basic_update_end)
                            ),
                            N("Extended maintenance is now available to get 18 months of additional updates (until %s).",
                              mdkapplet_gui::iso8601_date_to_locale(
                                  $extmaint_end)),
                            N("You can subscribe <b>right now</b> to get extended maintenance:"),
                       ),
                       @common),
                new_link_button('http://www2.mandriva.com/support/lifecycle/', 
                                N("Lifetime policy")),
                new_link_button($url, N("Online subscription"))
              ];
    }

    mdkapplet_gui::run_ask_credentials_dialog($title, 
					      $description, 
					      \&authenticate_callback,
                                              top_extra => $extra_info);
    return;
}

sub authenticate_callback {
    my ($email, $passwd) = @_;
    my $product = $product{$up_product};
    my $profile = mdkonline::get_my_mdv_profile($email, $passwd);

    if ($profile->{code} != 0) {
        my $in = interactive->vnew;
        $in->ask_warn(N("Error"), 
		      N("An error occurred") . "\n" . $profile->{message});
        goto &run_authentication_dialog;
    } 
    elsif (!$product->{has_rights}->($profile)) {
        mdkapplet_gui::run_no_rights_dialog(
            $title, 
            N("Your Mandriva account does not have %s download subscription enabled.", 
              mdkonline::translate_product($up_product)),
            $product{$up_product}{info_url}
            );
    } 
    else {
	add_medium_for_product($product, $email, $passwd);
    }
}

sub add_medium_for_product {
    my ($product, $email, $passwd) = @_;

    my $error = 0;
    my $current_arch = urpm::cfg::get_arch();
    # FIXME: This is not enough if we ever support more 64 archs
    # (sparc64, ppc64 and the like):
    my @archs = ($current_arch, if_($current_arch eq 'x86_64', 'i586'));

    foreach my $arch (@archs) {
	unless ($product->{add_medium}->($email, $passwd, $up_version, $arch)) {
            # FIXME: Backup original media setup so on error previous
            # added media in this loop can be removed?
	    $error = 1;
	    interactive->vnew->ask_warn(
		N("Error"), 
		N("An error occurred while adding medium")
		);
	    goto &run_authentication_dialog;
	}
    }

    unless ($error) {
        $product->{success_callback} and $product->{success_callback}->();
	my $w = ugtk2->new(N("Successfully added media!"),
			   grab => 1);
	$w->_ask_okcancel(N("Successfully added media %s.",
			    $product->{media_name}),
			  N("Ok"),
			  undef);
	ugtk2::main($w);
    }
}

sub get_extended_maintenance_data() {
    if (not $current_apimdv_distro) {
        require Rpmdrake::open_db;
        my @distros = mdkonline::get_distro_list();
        return if !@distros;
        $current_apimdv_distro = mdkonline::find_current_distro(@distros);
    }
    return @$current_apimdv_distro{ qw(extended-maintenance 
                                       extended-maintenance-end
                                       desktop-update-end
                                       basic-update-end) };
}
