/* indent:4  tabsize:8  font:fixed-width */

#import "Solitaire.h"
#import "ModuleList.h"
#import "localstrings.h"

#define GAMEDIRECTORY @"/LocalLibrary/Solitaire"

@implementation Solitaire(More)

/*----------------------------------------------------------------------------
|
|    - getGameType
|
|-----------------------------------------------------------------------------
|
|    Go find dynamically loadable Solitaire games in ~/Library/Solitaire,
|    Solitaire.app, and /LocalLibrary/Solitaire and any directory in 
|	 the ther user's defaults (SolitaireBundlePaths).  Load their descriptions
|    into the game-selection browser.
|			
\----------------------------------------------------------------------------*/

- (void) getGameType
{
    NSMatrix* 			theMatrix;
    NSMutableString* 	homeSolitairePath;
    NSString*			unseparatedBundlePaths;
    NSArray*			bundlePaths = nil;
    NSEnumerator*		bundlePathsEnumerator = nil;
    NSString*			aBundlePath;
    
    // Construct path to user's home lib.
    homeSolitairePath = [NSHomeDirectory() mutableCopy];
    [homeSolitairePath appendString:@"/Library/Solitaire"];

    // Get any paths from the user's defaults.
    unseparatedBundlePaths = [[NSUserDefaults standardUserDefaults] stringForKey:@"SolitaireBundlePaths"];
    if (unseparatedBundlePaths != nil && ![unseparatedBundlePaths isEqualToString:@""]) {
        bundlePaths = [unseparatedBundlePaths componentsSeparatedByString:@";"];
    }
    
    if (!moduleList)
    {
        moduleList = [[ModuleList allocWithZone:[self zone]] init];
    }

    // Do the obvious places first (on Mach anyway).
    [self loadGamesFrom:homeSolitairePath];
    [self loadGamesFrom:[self appDirectory]];
    [self loadGamesFrom:GAMEDIRECTORY];

    // Now do any paths found in the defaults.
    bundlePathsEnumerator = [bundlePaths objectEnumerator];
    while ((aBundlePath = [bundlePathsEnumerator nextObject]) != nil) {
        if (![aBundlePath isEqualToString:@""]) {
            [self loadGamesFrom:aBundlePath];
        }
    }
    
    if ([moduleList count] == 0)
    {
        NSRunAlertPanel([[NSProcessInfo processInfo] processName],
                        LOCALIZED_NOGAMES, LOCALIZED_TERMINATE, nil, nil);
	[NSApp terminate:self];
    }
    
    [moduleList sort];
    browserValid = NO;
    [gameSelectionBrowser loadColumnZero];
    theMatrix = [gameSelectionBrowser matrixInColumn:0];
    [theMatrix selectCellAtRow:realGameIndex column:0];
    [theMatrix scrollCellToVisibleAtRow:realGameIndex column:0]; 
}


/*----------------------------------------------------------------------------
|
|    - setGameType:(NSString *)filename dir:(NSString *)dirname
|
|-----------------------------------------------------------------------------
|
|    Load the description of the specified .solitaire bundle into the 
|    browser.
|			
\----------------------------------------------------------------------------*/

- (void) setGameType:(NSString *)filename dir:(NSString *)dirname
{
    NSMatrix* theMatrix;

    if (!moduleList)
    {
        moduleList = [[ModuleList allocWithZone:[self zone]] init];
    }

    browserValid = NO;
    [self addGameToList:filename dir:dirname];
    [moduleList sort];
    [gameSelectionBrowser loadColumnZero];
    theMatrix = [gameSelectionBrowser matrixInColumn:0];
    [theMatrix selectCellAtRow:realGameIndex column:0];
    [theMatrix scrollCellToVisibleAtRow:realGameIndex column:0]; 
}

/*----------------------------------------------------------------------------
|
|    - loadGamesFrom:(NSString *)dirname
|
|-----------------------------------------------------------------------------
|
|    Find all .solitaire modules in the specified directory.
|    If we find a module in several places, we keep only the first one found.
|			
\----------------------------------------------------------------------------*/

- (void) loadGamesFrom:(NSString *)dirname
{
    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *files = [fm directoryContentsAtPath:dirname];
    int i, count = [files count];

    for (i = 0; i < count; i++) {
        NSString *file = [files objectAtIndex:i];
        if ([[file pathExtension] isEqualToString:@"solitaire"]) {
            [self addGameToList:file dir:dirname];
        }
    }
}

/*----------------------------------------------------------------------------
|
|    - addGameToList:(NSString *)filename dir:(NSString *)dirname
|
|-----------------------------------------------------------------------------
|
|    Add the specified game to the list of games.
|
\----------------------------------------------------------------------------*/

- (void) addGameToList:(NSString *)filename dir:(NSString *)dirname
{
    ModuleInfo *m;
    int i, numstrings;
    NSString* gameName = nil;
    BOOL valid = YES;
   
    numstrings = [moduleList count];
    // Game.solitaire -> Game
    gameName = [[filename stringByDeletingPathExtension] lastPathComponent];

    // check for duplicate modules; keep only the first one found
    for (i=0; (i < numstrings) && (valid == YES); i++)
    {
	if ([gameName isEqualToString:[moduleList nameAtIndex:i]])
	{
	    // already have a module with this name
	    valid = NO;
	}
    }
    
    if (valid) 
    {
	NSString* path;

	// add a new entry for this module
	path = [dirname stringByAppendingPathComponent:filename];

	m = [[ModuleInfo allocWithZone:[self zone]] 
		initWithController:NULL name:gameName path:path];
	if (m)
	    [moduleList addObject:m];
    } 
}


/*----------------------------------------------------------------------------
|
|    - (NSString *)appDirectory
|
|    returns:  (NSString *) full path of main bundle
|
|-----------------------------------------------------------------------------
|
|    Returns the application's main bundle directory.
|			
\----------------------------------------------------------------------------*/

- (NSString *)appDirectory
{
    return [[NSBundle mainBundle] bundlePath];
}


@end
