package Cpanel::OldAddon2cPAddonsHandler;

BEGIN { push @INC, '/usr/local/cpanel'; }

use strict;
our $VERSION = '0.01';

require Exporter;
our @ISA    = qw(Exporter);
our @EXPORT = qw(OldAddon2cPAddonsHandler_mainpg
                 OldAddon2cPAddonsHandler_init);

use Cpanel::Form ();
use Cpanel::cPAddons::ConvertData;

sub OldAddon2cPAddonsHandler_init {
    $Cpanel::NEEDSREMOTEPASS{'OldAddon2cPAddonsHandler'} = 1;
    return 1;
}

sub OldAddon2cPAddonsHandler_mainpg { 
    my $input_hr = shift();
    if($input_hr->{'action'} eq 'upgrade') {
        upgrade($input_hr);
        print _mainpg_link();
    }
    elsif($input_hr->{'action'} eq 'convert_all_addons') {
        convert_all_addons($input_hr);
        print _mainpg_link();
    }
    elsif($input_hr->{'action'} eq 'convert_all') {
        convert_all($input_hr);
        print _mainpg_link();
    }
    elsif($input_hr->{'action'} eq 'dumpit') {
        dumpit($input_hr);
        print _mainpg_link();
    }
    elsif($input_hr->{'action'} eq 'convert') {
        convert($input_hr);
        print _mainpg_link();
    }
    else {
        _mainpg();
    } 
}

 ###############
#### functions ##
 ###############
 
sub _mainpg_link {
    return qq(<p align="center">[<a href="?action=1" />Main</a>]</p>\n);    
}

sub convert_all {
    print "<pre>\n";
    system('/scripts/oldaddoncgi2cpaddon', $Cpanel::user);
    print "</pre>\n";
}

sub convert_all_addons {
    my $input_hr = shift;
    my $addon = defined $input_hr->{'addon'} 
                && exists $Cpanel::cPAddons::ConvertData::aoi{ $input_hr->{'addon'} } 
                    ? $input_hr->{'addon'} : '';
    if($addon) {
    	print "<pre>\n";
    	system('/scripts/oldaddoncgi2cpaddon', $Cpanel::user, $addon);
    	print "</pre>\n";
    }
    else {
        print "Invalid addon!";
    }
}

sub convert {
    my $input_hr = shift();
    my ($importfile, $namespace, $oldaddon_htmlsafe, $path)
        = _set_importfile_if_valid( $input_hr->{'oldaddon'} );
        
    if(!$importfile) {
        print '<b>Please specify valid input.</b>';
    }
    else {
        print "<pre>\n";
        system('/scripts/oldaddoncgi2cpaddon',
               $Cpanel::user,
               split(/-/, $input_hr->{'oldaddon'}));
        print "</pre>\n";
    }
}
sub upgrade {
    my $input_hr = shift();    
    my ($importfile, $namespace, $oldaddon_htmlsafe, $path)
        = _set_importfile_if_valid( $input_hr->{'oldaddon'} );
        
    if(!$importfile) {
        print '<b>Please specify valid input.</b>';
    }
    elsif(-e $importfile) {
        print "This has already been exported to $importfile and will need "
              . 'imported since the upgrade failed once already apparently.';
    }
    else {
        my ($name) = split /-/, $oldaddon_htmlsafe;
        if($Cpanel::Addons::VERSION >= 1.1) {
            # these are in the skins call to this function but not the upgrade form's html ...
            my($auser, $apass) = ('','');
            if( Cpanel::Addons::installpage(
                                            $Cpanel::cPAddons::ConvertData::new2old_name_map{$name},
                                            $path,
                                            $auser,
                                            $apass,
                                            1,
                                           ) ) {
                print "Done";
            }
            else {
                print <<"DUMPF_END";
    <p><b>
      It appears the upgrade failed.
      At this point you have 2 options:</b><br />
      Do a fresh install of this addon in via cPAddons and then:
      <ul>
        <li> move the necessary files and data manually to it.
        <li> use the "import" facility (see below)
      </ul>
      <br />
      We can create a dump file of the install that can be used by the
      cPAddons installer to attempt to import the old install's data into it.
      Since the versions wil be different its not gauranteed to work.
      If there are problems you will have to do it via the manual option.
      <form action="$ENV{'SCRIPT_NAME'}">
        <input type="hidden" name="oldaddon" value="$oldaddon_htmlsafe" />
        <input type="hidden" name="action" value="dumpit" />
        <input type="submit" value="Create dumpfile for import" />
      </form>
    </p>
DUMPF_END
            }
        }
        else {
            print 'Error: Ask your admin to update your cPanel modules please';
        }
    }
}

sub dumpit {
    my $input_hr = shift();
    my ($importfile, $namespace, $oldaddon_htmlsafe, $path)
        = _set_importfile_if_valid( $input_hr->{'oldaddon'} );
        
    if(!$importfile || !$ENV{'REMOTE_PASSWORD'}) {
        print '<b>Please specify valid input.</b>' if !$importfile;
        print 'I do not have the data I need to continue, sorry'
            if !$ENV{'REMOTE_PASSWORD'};
    }
    else {
        if(chdir "$Cpanel::home/public_html/$path") {
            if(readdir CWD, '.') {
                my @tarup;
                my @files = grep($_ ne '.' && $_ ne '..', readdir(CWD));
                closedir DIR;
                
                require Cpanel::cPAddons::OldStock;
                
                for(@files) {
                    my $md5 = -d $_ ? ''
                                    : Digest::MD5::File::file_md5_hex($_);
                    push @tarup, $_
                        if !exists $Cpanel::cPAddons::OldStock::oldstock{$_}
                        || $md5 ne $Cpanel::cPAddons::OldStock::oldstock{$_};
                }
                
                my $db = '';
                if($oldaddon_htmlsafe !~ m/^agoracart[-]/) {
                    my($name) = split /-/, $oldaddon_htmlsafe;
                    my $dotfile = $oldaddon_htmlsafe =~ m/mychat/ 
                         ? ".addonscgi-Cpanel::cPAddons::ConvertData::new2old_name_map{$name}"
                         : '.phpchats';
                    
                    if(open my $dot_fh, $dotfile) {
                        my @installs = <$dot_fh>;
                        close $dot_fh;
                        
                        INSTALLED:
                        for my $install (@installs) {
                            my ($dir, $_db, $ver) = split / /, $install;
                            $db = $_db if $path eq $dir;
                        }
                        
                    }
                    else {
                        warn "open for read failed $oldaddon_htmlsafe: $!";
                    }
                }

                if($db) {
                    my $mysqldump = -x '/usr/local/bin/mysqldump'
                                    ? '/usr/local/bin/mysqldump'
                                    : '/usr/bin/mysqldump';
                    system $mysqldump , '-u', $Cpanel::user, "-p$ENV{'REMOTE_PASSWORD'}",
                           '--no-create-info', $db, '>',
                           "$importfile.sql", '2>/dev/null';
                    my($name) = split /-/, $oldaddon_htmlsafe;
                    if(exists $Cpanel::cPAddons::ConvertData::aoi{$name}->{'import_sql_remove'}) {
                        if(ref $Cpanel::cPAddons::ConvertData::aoi{$name}->{'import_sql_remove'} eq 'ARRAY') {
                            for(@{ $Cpanel::cPAddons::ConvertData::aoi{$name}->{'import_sql_remove'} }) {
                                system 'perl', '-pi', '-e',
                                       qq('s{ \\A $_ \\z }{}xms;'),
                                       "$importfile.sql";  
                            }
                        }
                    }
                    
                    for(qr(LOCK\s+TABLES\s+`), qr(INSERT\s+INTO\s+`)) {
                        system 'perl', '-pi', '-e',
                               q('s{$_}{$_\[\% table_prefix \%\]\_};'),
                               "$importfile.sql";
                    }
                }
                push @tarup, "$importfile.sql" if -e "$importfile.sql"
                                                  && -s "$importfile.sql";
                system 'tar', 'czf', $importfile, @tarup;
                unlink "$importfile.sql";
                
                print <<"IMPORT_END";
    <p>
      Your import file is here: $importfile <br />
      <form action="cpaddons.html">
        <input type="hidden" name="addon" value="$namespace" />
        <input type="hidden" name="import_file" value="$importfile" />
        <input type="submit" value="Import it" />
      </form>
    </p>  
IMPORT_END
            }
            else {
                print "Error! Could not read addon directory: $path : $!";
            }
        }
        else {
            print "Error! Could not go into addon directory: $path : $!";
        }
    }
}

sub _mainpg  {
    
    print qq(<h3>Old addon system installation manager.</h3>\n)
          . qq(<p>[<a href="?action=mainpg">Refresh this page</a>]</p>\n);

    print qq(<p>[<a href="?action=convert_all">Convert all of my old addons</a>]</p>\n);
    my %types;
    if(opendir HM, $Cpanel::homedir) {
        print qq(<table border="0">\n);
        my @files =  grep($_ ne '.' && $_ ne '..', readdir(HM));
        closedir HM;
        
        FILE:
        for my $file (@files) {
            next FILE if $file !~ m/\.acart/
                      && $file !~ m/\.addonscgi-/
                      && $file !~ m/\.phpchats/;
            if(open my $file_fh, "$Cpanel::homedir/$file") {
                my @lines = <$file_fh>;
                LINE:
                for my $line (@lines) {
                    chomp $line;
                    next LINE if !$line;
                    my $name;
                    my $dir;
                    my $unin;
                    my $ver;
                    my $db;
                    
                    if($file eq '.acart') {
                        $name = 'agoracart';
                        $dir  = $line;
                        $ver = '';
                        $unin = q{Agora installs cannot be uninstalled until converted.};
                        # a way to do agora uninstall ? make one if not ?
                    }
                    elsif($file eq '.phpchats') {
                        $name = 'phpmychat';
                        $ver = '';
                        ($dir, $db) = split / /, $line;
                        $unin = q{phpMyChat installs cannot be uninstalled until converted.};
                    }
                    else {
                        (undef, $name) = split /-/, $file;
                        ($dir, $db, $ver) = split / /, $line;
                        $unin = qq{<a target="_blank" href="kill.html?url=$dir&addonname=$name">Uninstall</a>};
                    }
                    
                    my $newname = $Cpanel::cPAddons::ConvertData::old2new_name_map{ $name };
                    if($name && $dir && $newname) {
                        $types{$newname}++;
                        my $oldaddon = "$newname-$dir";
                        my ($importfile, $namespace) = _set_importfile_if_valid($oldaddon);
                        my $link = qq{<a href="$ENV{'SCRIPT_NAME'}?action=convert&oldaddon=$oldaddon">Convert</a>};
                        if(-e $importfile) {
                            $link = qq{<a href="cpaddons.html?import_file=$importfile&addon=$namespace">Import</a>};
                        }
                        elsif($ver ne $ver){
                            $link = qq{<a href="$ENV{'SCRIPT_NAME'}?action=upgrade&oldaddon=$oldaddon">Upgrade</a>};
                        }
                        print qq(  <tr>\n)
                              . qq(    <td> $name </td><td> public_html/$dir </td>\n)
                              . qq(    <td> $link </td><td> $unin </td>\n)
                              . qq(  </tr>\n);
                    }
                }
            }
            else {
                print qq(  <tr><td colspan="4">Could not open $file: $!</td></tr>\n);
                next FILE;
            }
        }
        print qq(</table>\n);
        for(sort keys %types) {
            print qq(<p>[<a href="?action=convert_all_addons&addon=$_">Convert all $_</a>]</p>\n);
        }
    }
    else {
        print "Could not read home directory!: $!";
    }
}

sub _set_importfile_if_valid {
    my $oldaddon_param =  Cpanel::Form::escapehtml(shift());
    
    my ($name, $dir)   = split /-/, $oldaddon_param;
    return if !$name || !$dir || !exists $Cpanel::cPAddons::ConvertData::aoi{$name};
    
    my ($nameok, $namesp);
    my $ph_path = "$Cpanel::homedir/public_html/$dir/";
    
    if($name && $dir && -d $ph_path) {
        $nameok = "$Cpanel::homedir/.import_$oldaddon_param.tar.gz";
        $namesp = $Cpanel::cPAddons::ConvertData::aoi{$name}->{'convert'}{'namespace'};
    }
    return ($nameok, $namesp, $oldaddon_param, $ph_path);
}

1;
