#!/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 strict;
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
    },
    );

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

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


# ######################################################################
# 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();
}

sub run_authentication_dialog {
    my $description = N("Please fill in your account ID to add an additional package medium");
    mdkapplet_gui::run_ask_credentials_dialog($title, 
					      $description, 
					      \&authenticate_callback);
    ugtk2::exit(0);
}

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();
    my @archs = ($current_arch, if_($current_arch eq 'x86_64', 'i586'));

    foreach my $arch (@archs) {
	unless ($product->{add_medium}->($email, $passwd, $up_version, $arch)) {
	    $error = 1;
	    interactive->vnew->ask_warn(
		N("Error"), 
		N("An error occurred while adding medium")
		);
	    goto &run_authentication_dialog;
	}
    }

    unless ($error) {
	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);
    }
}
