#!/usr/bin/perl

########################################################################################################################
my $SYSTEM_VERS = $ARGV[0] . "/System/Library/CoreServices/SystemVersion.plist";
my $QT_VERS     = $ARGV[0] . "/System/Library/Frameworks/QuickTime.framework/Versions/A/Resources/Info.plist";
my $APP_VERS    = $ARGV[0] . "/Applications/Soundtrack Pro.app/Contents/Info.plist";
my $KIT_VERS    = $ARGV[0] . "/System/Library/PrivateFrameworks/ProKit.framework/Versions/Current/Resources/Info.plist";
my $TIER_3_LANG = $ARGV[0] . "/var/db/.AppleTier3Language";
my $EXIT_VALUE  = 0;
########################################################################################################################

DO_CHECKS: {
    # Startup volume only
    if( $ARGV[0] ne "/" ) {
		$EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 17 );
    }
    # OS required
    if( ! -e "$SYSTEM_VERS" ) {
		$EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 16 );
		last;
	}
    # OS 10.3.9 or better required
	if(CheckVersion("$SYSTEM_VERS", "10.3.9", "ProductVersion", "<")) {
		$EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 16 );
		last;
	}
    # App required
	if(!-e $ARGV[0]."/Applications/Soundtrack Pro.app/Contents/Info.plist")
    {
	    $EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 21 );
	    last;
	}
    # App version 1.0.0 or better required
    if(CheckVersion("$APP_VERS", "1.0.0", "CFBundleShortVersionString", "<")) {
        $EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 20 );
        last;
    }
    # App version 1.0.3 or less required
    if(CheckVersion("$APP_VERS", "1.0.3", "CFBundleShortVersionString", ">")) {
        $EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 20 );
        last;
    }
    # QT version 7.0 or better required
    if(CheckVersion("$QT_VERS", "7.0", "CFBundleShortVersionString", "<")) {
        $EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 19 );
        last;
    }
    # ProKit version 3.1 or better required
    if(CheckVersion("$KIT_VERS", "3.1", "CFBundleShortVersionString", "<")) {
        $EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 22 );
        last;
    }
    # Must NOT be tier 3
	if (-e $TIER_3_LANG) {
		$EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ) | 18 );
		last;
	}

}
exit($EXIT_VALUE);

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;
    }

}

