#!/usr/bin/perl

my $target = $ARGV[2];
my $pkg = $ARGV[0];

############################

#Locating the app that was probably updated

FINDAPP: {
        if(CheckVersion("$target/Applications/Final Cut Pro HD.app/Contents/Info.plist", "4.0", "CFBundleShortVersionString", ">=")) {
                if(CheckVersion("$target/Applications/Final Cut Pro HD.app/Contents/Info.plist", "4.5", "CFBundleShortVersionString", "<=")) {
                        $appLocation = "$target/Applications/Final Cut Pro HD.app";
                        last;
                }
        }
	if(CheckVersion("$target/Applications/Final Cut Pro.app/Contents/Info.plist", "4.0", "CFBundleShortVersionString", ">=")) {
	        if(CheckVersion("$target/Applications/Final Cut Pro.app/Contents/Info.plist", "4.5", "CFBundleShortVersionString", "<=")) {
			$appLocation = "$target/Applications/Final Cut Pro.app";
	                last;
	        }
	}
        if(CheckVersion("$target/Applications/Final Cut Pro 4.app/Contents/Info.plist", "4.0", "CFBundleShortVersionString", ">=")) {
                if(CheckVersion("$target/Applications/Final Cut Pro 4.app/Contents/Info.plist", "4.5", "CFBundleShortVersionString", "<=")) {
                        $appLocation = "$target/Applications/Final Cut Pro 4.app";
                        last;
                }
        }
        if(CheckVersion("$target/Applications/Final Cut Pro 4.0.app/Contents/Info.plist", "4.0", "CFBundleShortVersionString", ">=")) {
                if(CheckVersion("$target/Applications/Final Cut Pro 4.0.app/Contents/Info.plist", "4.5", "CFBundleShortVersionString", "<=")) {
                        $appLocation = "$target/Applications/Final Cut Pro 4.0.app";
                        last;
                }
        }
        if(CheckVersion("$target/Applications/Final Cut Pro4.app/Contents/Info.plist", "4.0", "CFBundleShortVersionString", ">=")) {
                if(CheckVersion("$target/Applications/Final Cut Pro4.app/Contents/Info.plist", "4.5", "CFBundleShortVersionString", "<=")) {
                        $appLocation = "$target/Applications/Final Cut Pro4.app";
                        last;
                } 
        }
	if(CheckVersion("$target/Applications/FCP4.app/Contents/Info.plist", "4.0", "CFBundleShortVersionString", ">=")) {
                if(CheckVersion("$target/Applications/FCP4.app/Contents/Info.plist", "4.5", "CFBundleShortVersionString", "<=")) {
                        $appLocation = "$target/Applications/FCP4.app";
                        last;
                }
        }
        if(CheckVersion("$target/Applications/FCP 4.app/Contents/Info.plist", "4.0", "CFBundleShortVersionString", ">=")) {
                if(CheckVersion("$target/Applications/FCP 4.app/Contents/Info.plist", "4.5", "CFBundleShortVersionString", "<=")) {
                        $appLocation = "$target/Applications/FCP 4.app";
                        last;
                }
        }
        if(CheckVersion("$target/Applications/FCP 4.0.app/Contents/Info.plist", "4.0", "CFBundleShortVersionString", ">=")) {
                if(CheckVersion("$target/Applications/FCP 4.0.app/Contents/Info.plist", "4.5", "CFBundleShortVersionString", "<=")) {
                        $appLocation = "$target/Applications/FCP 4.0.app";
                        last;
                }
        }
	{
		$appLocation = "$target/Applications/Final Cut Pro HD.app";
                last;
	}
}

############################

#Rename the app to the default name

if (-e $appLocation && ! -e "$target/Applications/Final Cut Pro HD.app")
{
	`/bin/mv "$appLocation" "$target/Applications/Final Cut Pro HD.app"`;
	$appLocation = "$target/Applications/Final Cut Pro HD.app";
}

############################

#Remove depricated files

`/bin/rm -rf "$appLocation/Contents/Resources/English.lproj/FXScripts/Filters/Video/Timecode Print.txt" >/dev/null 2>&1`;

`/bin/rm -rf "$appLocation/Contents/Frameworks/AERegistration.framework/Headers" >/dev/null 2>&1`;
`/bin/rm -rf "$appLocation/Contents/Frameworks/AERegistration.framework/Versions/A/Headers/" >/dev/null 2>&1`;

`/bin/rm -rf "$appLocation/Contents/Resources/English.lproj/FXScripts/Filters/Video/View Finder.txt" >/dev/null 2>&1`;
`/bin/rm -rf "$appLocation/Contents/Resources/French.lproj/FXScripts/Filters/Video/View Finder.txt" >/dev/null 2>&1`;
`/bin/rm -rf "$appLocation/Contents/Resources/German.lproj/FXScripts/Filters/Video/View Finder.txt" >/dev/null 2>&1`;
`/bin/rm -rf "$appLocation/Contents/Resources/Japanese.lproj/FXScripts/Filters/Video/View Finder.txt" >/dev/null 2>&1`;

`/bin/rm -rf "$target/Library/Application Support/Final Cut Pro System Support/Custom Settings/無圧縮 8 ビット NTSC 48 kHz" >/dev/null 2>&1`;
`/bin/rm -rf "$target/Library/Application Support/Final Cut Pro System Support/Custom Settings/無圧縮 8 ビット PAL 48 kHz" >/dev/null 2>&1`;
`/bin/rm -rf "$target/Library/Application Support/Final Cut Pro System Support/Custom Settings/無圧縮 10 ビット PAL 48 kHz" >/dev/null 2>&1`;
`/bin/rm -rf "$target/Library/Application Support/Final Cut Pro System Support/Custom Settings/無圧縮 10 ビット NTSC 48 kHz" >/dev/null 2>&1`;

`/bin/rm -rf "$target/Applications/Final Cut Pro Additional Easy Setups" >/dev/null 2>&1`;
#`/bin/rm -rf "$target/Applications/Final Cut Pro Additional Easy Setups/Japanese/無圧縮 8 ビット NTSC 48 kHz" >/dev/null 2>&1`;
#`/bin/rm -rf "$target/Applications/Final Cut Pro Additional Easy Setups/Japanese/無圧縮 8 ビット PAL 48 kHz" >/dev/null 2>&1`;
#`/bin/rm -rf "$target/Applications/Final Cut Pro Additional Easy Setups/Japanese/無圧縮 10 ビット PAL 48 kHz" >/dev/null 2>&1`;
#`/bin/rm -rf "$target/Applications/Final Cut Pro Additional Easy Setups/Japanese/無圧縮 10 ビット NTSC 48 kHz" >/dev/null 2>&1`;

############################

print "Fixing Registration Format...\n";
`"$pkg/Contents/Resources/RegFixer" 16 4 0`;

my $bundleLinkPath = `/usr/bin/sudo -u $ENV{'USER'} "$pkg/Contents/Resources/BundleBuddy" "$pkg/Contents/Resources/CustomSettings.bundle" -c "Resource SettingsDir"`;
my $returnValue = $? >> 8;
if (!$returnValue) {
    `/bin/mkdir -p "$target/Library/Application Support/Final Cut Pro System Support/Custom Settings/"`;
    open (PATHFILE, "$bundleLinkPath");
    $sourceDir = <PATHFILE>;
    close PATHFILE;
    chomp $sourceDir;
    `/usr/bin/ditto -rsrc "$sourceDir" "$target/Library/Application Support/Final Cut Pro System Support/Custom Settings/"`;
    `/bin/chmod 775 "$target/Library/Application Support/Final Cut Pro System Support"`; 
    `/bin/chmod 775 "$target/Library/Application Support/Final Cut Pro System Support/Custom Settings"`;
}

exit(0);

sub CheckVersion
{
    my $path            = $_[0];
    my $version         = $_[1];
    my $keyName         = $_[2];
    my $operator        = $_[3];

    if (! -e $path) {
        return 0;
    }

    if (!$operator) {
        $operator = "==";
    }

    my $oldSeperator = $/;
    $/ = \0;

    open( PLIST, "$path") || do {
        return 0;
    };

    $plistData = <PLIST>;
    $plistData =~ /<dict>(.*?)<\/dict>/gis;

    @items = split(/<key>/, $plistData);

    shift @items;
    foreach $item (@items) {
        $item =~ /(.*?)<\/key>.*?<string>(.*?)<\/string>/gis;
        $versiondata{ $1 } = $2;
    }

    close(PLIST);

    $/ = $oldSeperator;

    @theVersionArray = split(/\./, $versiondata{$keyName});
    for ($i = 0; $i < 3; $i++) {
        if(!$theVersionArray[$i]) {
            $theVersionArray[$i] = '0';
        }
    }

    @versionArray = split(/\./, $version);
    
    my $actualVersion;

    for ($i = 0; $i < 3; $i++) {
        if (($theVersionArray[$i] != $versionArray[$i]) or ($i == 2)) {

            $actualVersion = $theVersionArray[$i];
            $version = $versionArray[$i];

            last;
        }
    }

    my $expression = '$actualVersion ' . $operator . ' $version';
    if( eval ($expression) )
    {
        return 1;
    }
    else
    {
        return 0;
    }

}
