# vim: set et ts=4 sw=4:
package ManaTools::Rpmdragora::init;
#*****************************************************************************
#
#  Copyright (c) 2002 Guillaume Cottenceau
#  Copyright (c) 2002-2007 Thierry Vignaud <tvignaud@mandriva.com>
#  Copyright (c) 2003, 2004, 2005 MandrakeSoft SA
#  Copyright (c) 2005-2007 Mandriva SA
#  Copyright (c) 2013-2017 Matteo Pasotti <matteo.pasotti@gmail.com>
#  Copyright (c) 2014-2017 Angelo Naselli <anaselli@linux.it>
#
#  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.
#
#*****************************************************************************
#
# $Id: init.pm 263915 2009-12-03 17:41:04Z tv $

use strict;
use MDK::Common::Func qw(any if_);
use English;
BEGIN { $::no_global_argv_parsing = 1 }
require urpm::args;
use MDK::Common::Various qw(chomp_);

use ManaTools::Privileges;
use ManaTools::Shared::Locales;

use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(init
                 warn_about_user_mode
                 $MODE
                 $VERSION
                 $changelog_first
                 $default_list_mode
                 %rpmdragora_options
                 @ARGV_copy
                 );

our @ARGV_copy =  @ARGV;

BEGIN {  #- we want to run this code before the Gtk->init of the use-my_gtk
    my $locale_dir = undef;

    if ("@ARGV" =~/--locales-dir(\s*(.+))/) {
        $locale_dir = $2 ? $2 : $1;
    }
    my $loc = ManaTools::Shared::Locales->new(
            domain_name => 'manatools',
            dir_name    => $locale_dir,
    );


    my $basename = sub { local $_ = shift; s|/*\s*$||; s|.*/||; $_ };
    any { /^--?h/ } @ARGV and do {
        printf join("\n", $loc->N("Usage: %s [OPTION]...", $basename->($0)),
                    $loc->N("  --auto                 assume default answers to questions"),
                    $loc->N("  --changelog-first      display changelog before filelist in the description window"),
                    $loc->N("  --media=medium1,..     limit to given media"),
                    $loc->N("  --merge-all-rpmnew     propose to merge all .rpmnew/.rpmsave files found"),
                    $loc->N("  --mode=MODE            set mode (install (default), remove, update)"),
                    $loc->N("  --justdb               update the database, but do not modify the filesystem"),
                    $loc->N("  --no-confirmation      don't ask first confirmation question in update mode"),
                    $loc->N("  --no-media-update      don't update media at startup"),
                    $loc->N("  --no-verify-rpm        don't verify package signatures"),
                    if_($0 !~ /dragoraUpdate/, $loc->N("  --parallel=alias,host  be in parallel mode, use \"alias\" group, use \"host\" machine to show needed deps")),
                    $loc->N("  --rpm-root=path        use another root for rpm installation"),
                    $loc->N("  --urpmi-root           use another root for urpmi db & rpm installation"),
                    $loc->N("  --run-as-root          force to run as root"),
                    $loc->N("  --search=pkg           run search for \"pkg\""),
                    $loc->N("  --test                 only verify if the installation can be achieved correctly"),
                    chomp_($loc->N("  --version              print this tool's version number
                    ")),
                    ""
        );
        exit 0;
    };
}

BEGIN { #- for mcc
    if ("@ARGV" =~ /--embedded (\w+)/) {
	$::XID = $1;
	$::isEmbedded = 1;
    }
}


#- This is needed because text printed by Gtk2 will always be encoded
#- in UTF-8; we first check if LC_ALL is defined, because if it is,
#- changing only LC_COLLATE will have no effect.
use POSIX qw(setlocale LC_ALL LC_COLLATE strftime);
use locale;
my $collation_locale = $ENV{LC_ALL};
if ($collation_locale) {
  $collation_locale =~ /UTF-8/ or setlocale(LC_ALL, "$collation_locale.UTF-8");
} else {
  $collation_locale = setlocale(LC_COLLATE);
  $collation_locale =~ /UTF-8/ or setlocale(LC_COLLATE, "$collation_locale.UTF-8");
}

our $VERSION = "1.0.0";
our %rpmdragora_options;

my $i;
foreach (@ARGV) {
    $i++;
    /^-?-(\S+)$/ or next;
    my $val = $1;
    if ($val =~ /=/) {
        my ($name, $values) = split /=/, $val;
        my @values = split /,/, $values;
        $rpmdragora_options{$name} = \@values if @values;
    } else {
        if ($val eq 'version') {
            print "$0 $VERSION\n";
            exit(0);
       } elsif ($val =~ /^(test|expert)$/) {
           eval "\$::$1 = 1";
       } elsif ($val =~ /^(q|quiet)$/) {
           urpm::args::set_verbose(-1);
       } elsif ($val =~ /^(v|verbose)$/) {
           urpm::args::set_verbose(1);
       } else {
           $rpmdragora_options{$val} = 1;
       }
    }
}

foreach my $option (qw(media mode parallel rpm-root search)) {
    if (defined $rpmdragora_options{$option} && !ref($rpmdragora_options{$option})) {
        warn qq(wrong usage of "$option" option!\n);
        exit(-1); # too early for my_exit()
    }
}

$urpm::args::options{basename} = 1;

our $MODE = ref $rpmdragora_options{mode} ? $rpmdragora_options{mode}[0] : undef;
our $overriding_config = defined $MODE;
unless ($MODE) {
    $MODE = 'install';
    $0 =~ m|remove$|  and $MODE = 'remove';
    $0 =~ m|update$|i and $MODE = 'update';
}

our $default_list_mode;
$default_list_mode = 'gui_pkgs' if $MODE eq 'install';
if ($MODE eq 'remove') {
    $default_list_mode = 'installed';
} elsif ($MODE eq 'update') {
    $default_list_mode = 'all_updates';
}

$MODE eq 'update' || $rpmdragora_options{'run-as-root'} and ManaTools::Privileges::is_root_capability_required();
$::noborderWhenEmbedded = 1;

require ManaTools::rpmdragora;

our $changelog_first = $ManaTools::rpmdragora::changelog_first_config->[0];
$changelog_first = 1 if $rpmdragora_options{'changelog-first'};

sub warn_about_user_mode() {
    my $loc = ManaTools::rpmdragora::locale();
    my $title = $loc->N("Running in user mode");
    my $msg = $loc->N("You are launching this program as a normal user.\n".
                "You will not be able to perform modifications on the system,\n".
                "but you may still browse the existing database.");

    if(($EUID != 0) and (!ManaTools::rpmdragora::interactive_msg($title, $msg))) {
        return 0;
    }
    return 1;
}

sub init() {
    URPM::bind_rpm_textdomain_codeset();
}

1;