#!/usr/bin/perl 

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

use strict;
use Cpanel;
use Storable;
# use DBI; ??
use Cpanel::cPAddons::ConvertData;

my $user   = $ARGV[0]    || '';
my $aoname = lc $ARGV[1] || '';
my $aopath = $ARGV[2]    || '';
my $quiet  = $ARGV[3]    || 0;

if(!$user && -t STDIN) {
   print 'What user do you want to fix up? : ';
   $user = <STDIN>;
   chomp $user;
}

die 'Please supply a user' if !$user;
die 'I do not know what that addon is'
    if $aoname && !exists $Cpanel::cPAddons::ConvertData::aoi{$aoname};
    
my $cp = Cpanel->new();
$cp->initcp($user);
	
die "Invalid User" if $Cpanel::user ne $user;

chdir $Cpanel::homedir or die "Could not chdir into $Cpanel::homedir: $!";
if(!-d "$Cpanel::homedir/.cpaddons/") {
    mkdir  "$Cpanel::homedir/.cpaddons/"
        or die "Could not make $Cpanel::homedir/.cpaddons/: $!";
}

my @addons = $aoname ? ($aoname) : sort keys %Cpanel::cPAddons::ConvertData::aoi;
for(@addons) {
    if($Cpanel::cPAddons::ConvertData::aoi{$_}->{'noconvert'}) {
        my $name = $Cpanel::cPAddons::ConvertData::aoi{$_}->{'convert'}{'name'};
        if(-e $Cpanel::cPAddons::ConvertData::aoi{$_}->{'dotfile'}) {
            print "!!!! Note: $name conversion can not be done :\n"
                  . "\t1) install a new $name via the new addon interface\n"
                  . "\t2) import the database from the old $name\n\t3) remove"
                  . " the old installation via the old addon interface\n";
	}
	else {
	   print "No $name Installs to fix up.\n" unless $quiet;
	}
    }
    else {
        convert($Cpanel::cPAddons::ConvertData::aoi{$_}->{'convert'});
    }
}

 ###############
#### functions ##
 ###############

sub register {
    my ($hr,$rewrite_ref, $name, $quiet) = @_;
    my $num = 0;
    while(-e "./.cpaddons/$hr->{addon}.$num") {
        $num++;
    }
    $hr->{registry} = "$hr->{addon}.$num";
    if(store $hr, "./.cpaddons/$hr->{registry}") {
        print "$hr->{registry} $hr->{installpath} successfully fixed up!\n"
            unless $quiet;
    }
    else {
        warn "Could not store info for new $name system: $!";
        ${ $rewrite_ref }
            .= "$hr->{installpath} $hr->{mysql_user_post} $hr->{version}\n";
    }
}

sub convert {
    my $h = shift;
    print "Starting $h->{name} $aopath...\n" unless $quiet;
 
    if(-e "./$h->{dotfile}") {
        open AOR, "./$h->{dotfile}" or die "Could not open ./$h->{dotfile}: $!";
        my @installs = <AOR>;
        close AOR;

        my $rewrite = '';
        for(@installs) {
            chomp;
            next if !$_;
            my ($dir,$dbp,$ver) = split /\s+/;
	    $dbp = '' if !defined $dbp;
	    $ver = '' if !defined $ver;
	    if($aopath && $dir ne $aopath) {
	        print "Skipping $dir since its not $aopath\n" unless $quiet;
                $rewrite .= "$dir $dbp $ver\n";
		next;
	    }
            if($ver !~ m/^\Q$h->{version}\E\-?/) {
                $rewrite .= "$dir $dbp $ver\n";
                print "Skipping $dir since its not version $h->{version}\n"
                    unless $quiet;
                next;
            }
            my $aohr =  $h->{handler}->($dir,$dbp,$ver,\$rewrite);
            if( ref $aohr eq 'HASH' ) {
                if(!%{ $aohr }) {
                    warn "Convert hash is empty!";
                    $rewrite .= "$dir $dbp $ver\n"
                        if $rewrite !~ m/^$dir $dbp $ver\n/;
                }
                else {
                    register($aohr, \$rewrite, $h->{name}, $quiet);
                }
            }
            else {
                warn "handler did not return a hashref!";
            }
        }
        
        open AOW, '>', "./$h->{dotfile}"
            or die "Could not open ./$h->{dotfile}: $!";
        print AOW $rewrite;
        close AOW;
	
        if(-z "./$h->{dotfile}") {
            unlink "./$h->{dotfile}"
                or die "Could not remove ./$h->{dotfile}: $!";
        }
        else {
            warn "./$h->{dotfile} not removed since there was some installs"
                 . ' that did not get fixed up right.';
        }
    }
    else {
        print "No $h->{name} Installs to fix up.\n" unless $quiet;
    } 
}
