/*
 * main_debug.c
 * Sapphire
 *
 * Created by Graham Booker on Aug. 2, 2008.
 * Copyright 2007 Sapphire Development Team and/or www.nanopi.net
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
 * General Public License as published by the Free Software Foundation; either version 3 of the License,
 * or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
 * Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along with this program; if not,
 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

#import "SapphireImportHelper.h"
#import <CoreData/CoreData.h>

#include "../SapphireCompatibilityClasses/Sapphire_Prefix.pch"

//Debug Imports
#import "SapphireCollectionDirectory.h"
#import "SapphireDirectoryMetaData.h"
#import "SapphireApplianceController.h"
#import "SapphireMetaDataUpgrading.h"
#import "SapphireMovie.h"
#import "CoreDataSupportFunctions.h"
#import "SapphireFileMetaData.h"
#import "SapphireFileDataImporter.h"
#import "SapphireXMLFileDataImporter.h"
#import "SapphireTVShowImporter.h"
#import "SapphireMovieImporter.h"
#import "SapphireMetaDataSupport.h"
#import "SapphireAllImporter.h"
#import "SapphireTVShow.h"
#import "SapphireGenre.h"
#import "SapphireCast.h"
#import "SapphireDirector.h"
#import "SapphireXMLData.h"

void overrideApplicationSupportdir(NSString *override);

@interface TestFileScanning : NSObject <SapphireMetaDataScannerDelegate>
{
	int i;
	NSArray	*collections;
	NSMutableSet *skip;
}
- (id)initWithCollections:(NSArray *)col;
@end

@implementation TestFileScanning

- (id)initWithCollections:(NSArray *)col
{
	self = [super init];
	
	collections = [col retain];
	skip = [[NSMutableSet alloc] init];
	i=-1;
	
	return self;
}

- (void) dealloc
{
	[collections release];
	[skip release];
	[super dealloc];
}

- (void)gotSubFiles:(NSArray *)subs
{
	i++;
	if(i==[collections count])
		NSLog(@"DONE!!!");
	else
	{
		[[(SapphireCollectionDirectory *)[collections objectAtIndex:i] directory] getSubFileMetasWithDelegate:self skipDirectories:skip];
	}
}

- (void)scanningDir:(NSString *)dir
{
}

- (BOOL)getSubFilesCanceled
{
	return NO;
}

@end

@interface SapphireMetaDataUpgrading (debug)
- (void)doUpgrade:(id)obj;
@end

@interface SapphireMetaDataSupport (debug)
+ (void)deletePendingObjects;
@end




int main(int argc, char *argv[])
{
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
	
	{
		NSString *path = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:argv[0] length:strlen(argv[0])];
		
		path = [[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Sapphire.frappliance"];
		
		NSBundle *bundle = [NSBundle bundleWithPath:path];
		[bundle load];		
	}
	
//	overrideApplicationSupportdir([NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Frontrow"]);
//#define TESTING_UPGRADE
#ifdef TESTING_UPGRADE
	{
		SapphireMetaDataUpgrading *upgrade = [[SapphireMetaDataUpgrading alloc] init];
		[upgrade doUpgrade:nil];
		[upgrade release];
	}
#endif
	
	NSString *storeFile = [applicationSupportDir() stringByAppendingPathComponent:@"metaData.sapphireDataV2"];
	BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:storeFile];
	if(!exists)
		return 0;
	
	NSManagedObjectContext *moc = [SapphireApplianceController newManagedObjectContextForFile:storeFile];
	[SapphireMetaDataSupport setMainContext:moc];
	
	//Debug code goes here:
//#define LISTING_MOVIES
#ifdef LISTING_MOVIES
	{
		NSArray *allMovies = doFetchRequest(SapphireMovieName, moc, nil);
		NSEnumerator *movieEnum = [allMovies objectEnumerator];
		SapphireMovie *movie;
		while((movie = [movieEnum nextObject]) != nil)
		{
			NSLog(@"Looking at movie %@ with xml: %d", [movie title], [[movie xmlSet] count]);
			NSLog(@"Cast is %@", [movie valueForKeyPath:@"cast.name"]);
			NSLog(@"Directors is %@", [movie valueForKeyPath:@"directors.name"]);
			NSLog(@"Genres is %@", [movie valueForKeyPath:@"genres.name"]);
			NSLog(@"Plot is %@", [movie plot]);
		}		
	}
#endif
//#define TESTING_XML_IMPORT
#ifdef TESTING_XML_IMPORT
	{
		NSString *path = @"/Users/gbooker/Movies/Little Einsteins.avi";
		SapphireFileMetaData *meta = [SapphireFileMetaData fileWithPath:path inContext:moc];
		[meta clearMetaData];
		[SapphireMetaDataSupport save:moc];
		SapphireXMLFileDataImporter *importer = [[SapphireXMLFileDataImporter alloc] init];
		[importer importMetaData:meta path:[meta path]];
		[importer release];		
	}
#endif
//#define TESTING_FILE_SCANNING
#ifdef TESTING_FILE_SCANNING
	{
		NSMutableArray *collections = [[SapphireCollectionDirectory allCollectionsInContext:moc] mutableCopy];
		//remove / and ~/Movies
		[collections removeObjectAtIndex:0];
		[collections removeObjectAtIndex:0];
		TestFileScanning *debug = [[TestFileScanning alloc] initWithCollections:collections];
		[NSTimer scheduledTimerWithTimeInterval:0 target:debug selector:@selector(gotSubFiles:) userInfo:nil repeats:NO];
		[debug release];
		
		NSRunLoop *currentRL = [NSRunLoop currentRunLoop];
		while([currentRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]])
			;		
	}
#endif
//#define TESTING_UPDATED_VALUES
#ifdef TESTING_UPDATED_VALUES
	{
		NSString *path = @"/Users/gbooker/Movies/Little Einsteins.avi";
		SapphireFileMetaData *meta = [SapphireFileMetaData fileWithPath:path inContext:moc];
		[meta clearMetaData];
		SapphireXMLFileDataImporter *xmlImpr = [[SapphireXMLFileDataImporter alloc] init];
		SapphireFileDataImporter *fileImp = [[SapphireFileDataImporter alloc] init];
		SapphireTVShowImporter *tvImp = [[SapphireTVShowImporter alloc] initWithContext:moc];
		SapphireMovieImporter *movImp = [[SapphireMovieImporter alloc] initWithContext:moc];
		SapphireAllImporter *allImporter = [[SapphireAllImporter alloc] initWithImporters:[NSArray arrayWithObjects:xmlImpr,tvImp,movImp,fileImp,nil]];
		[xmlImpr release];
		[fileImp release];
		[tvImp release];
		[movImp release];
		
		[allImporter importMetaData:meta path:[meta path]];
		
		NSDictionary *changes = [SapphireMetaDataSupport changesDictionaryForContext:moc];
		[moc reset];
		[SapphireMetaDataSupport applyChanges:changes toContext:moc];
		[allImporter release];
	}
#endif
//#define TESTING_DIRECTORY_RESCAN
#ifdef TESTING_DIRECTORY_RESCAN
	{
		SapphireMovie *movie = [SapphireMovie movieWithTitle:@"Little Eistiens: Our Big Huge Adventure" inContext:moc];
		SapphireFileMetaData *file = [SapphireFileMetaData fileWithPath:@"/Users/gbooker/Movies/Little Einsteins.avi" inContext:moc];
		[moc deleteObject:file];
		[moc processPendingChanges];
		SapphireDirectoryMetaData *dir = [SapphireDirectoryMetaData directoryWithPath:@"/Users/gbooker/Movies" inContext:moc];
		[dir reloadDirectoryContents];
	}
#endif
#define TESTING_AUTO_PRUNING
#ifdef TESTING_AUTO_PRUNING
	{
		SapphireFileMetaData *file = [SapphireFileMetaData fileWithPath:@"/Users/gbooker/Movies/MovieTests/Little Einsteins.avi" inContext:moc];
		SapphireXMLData *xml = [file xmlData];
		[moc deleteObject:xml];
		[SapphireMetaDataSupport deletePendingObjects];
		SapphireDirectoryMetaData *dir = [SapphireDirectoryMetaData directoryWithPath:@"/Users/gbooker/Movies/MovieTests" inContext:moc];
		[moc deleteObject:dir];
		[SapphireMetaDataSupport deletePendingObjects];
		dir = [SapphireDirectoryMetaData directoryWithPath:@"/Users/gbooker/Movies/TVShowsTests" inContext:moc];
		[moc deleteObject:dir];
		[SapphireMetaDataSupport deletePendingObjects];
		NSArray *allMovies = doFetchRequest(SapphireMovieName, moc, nil);
		NSArray *allShows = doFetchRequest(SapphireTVShowName, moc, nil);
		NSArray *allGenres = doFetchRequest(SapphireGenreName, moc, nil);
		NSArray *allCast = doFetchRequest(SapphireCastName, moc, nil);
		NSArray *allDirectors = doFetchRequest(SapphireDirectorName, moc, nil);
		
		NSLog(@"Movies: %@\nShows: %@\nCast: %@\nGenres: %@\nDirectors: %@", allMovies, allShows, allCast, allGenres, allDirectors);
	}
#endif
	
	[pool release];
	
	return 0;
}
