#import "SapphireCollectionDirectory.h"
#import "SapphireDirectoryMetaData.h"
#import "CoreDataSupportFunctions.h"

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mount.h>

#define MY_NAME @"CollectionDirectory"

@implementation SapphireCollectionDirectory

+ (SapphireCollectionDirectory *)collectionAtPath:(NSString *)path mount:(BOOL)isMount skip:(BOOL)skip hidden:(BOOL)hidden inContext:(NSManagedObjectContext *)moc
{
	SapphireDirectoryMetaData *dir = [SapphireDirectoryMetaData createDirectoryWithPath:path inContext:moc];
	SapphireCollectionDirectory *ret = dir.collectionDirectory;
	if(ret != nil)
		return ret;
	
	ret = [NSEntityDescription insertNewObjectForEntityForName:MY_NAME inManagedObjectContext:moc];
	
	ret.isMountValue = isMount;
	ret.skipValue = skip;
	ret.hiddenValue = hidden;
	ret.directory = dir;
	
	return ret;
}

+ (SapphireCollectionDirectory *)collectionAtPath:(NSString *)path inContext:(NSManagedObjectContext *)moc
{
	return [SapphireCollectionDirectory collectionAtPath:path mount:YES skip:NO hidden:NO inContext:moc];
}

+ (NSArray *)availableCollectionDirectoriesInContext:(NSManagedObjectContext *)moc
{
	NSMutableSet *colSet = [NSMutableSet set];
    struct statfs *mntbufp;
	
    int i, mountCount = getmntinfo(&mntbufp, MNT_NOWAIT);
	for(i=0; i<mountCount; i++)
	{
		if(!strcmp(mntbufp[i].f_fstypename, "autofs"))
			continue;
		if(!strcmp(mntbufp[i].f_fstypename, "volfs"))
			continue;
		if(!strcmp(mntbufp[i].f_mntonname, "/dev"))
			continue;
		[colSet addObject:[NSString stringWithCString:mntbufp[i].f_mntonname]];
	}
	[colSet removeObject:@"/mnt"];
	[colSet removeObject:@"/CIFS"];
	[colSet removeObject:NSHomeDirectory()];
	NSString *homeMoviesPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Movies"];
	if([[NSFileManager defaultManager] fileExistsAtPath:homeMoviesPath])
		[colSet addObject:homeMoviesPath];
	NSEnumerator *mountEnum = [colSet objectEnumerator];
	NSString *mountPoint;
	while((mountPoint = [mountEnum nextObject]) != nil)
		[SapphireCollectionDirectory collectionAtPath:mountPoint mount:YES skip:NO hidden:NO inContext:moc];
	
	NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(isMount == NO) OR (directory.path IN %@)", colSet];
	NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"directory.path" ascending:YES];
	NSArray *ret = doSortedFetchRequest(MY_NAME, moc, predicate, sort);

	[sort release];
	return ret;
}
@end
