//
//  Node.m
//  Cog
//
//  Created by Vincent Spader on 8/20/2006.
//  Copyright 2006 Vincent Spader. All rights reserved.
//

#import "PathNode.h"

#import "CogAudio/AudioPlayer.h"

#import "FileTreeDataSource.h"

#import "ContainerNode.h"
#import "DirectoryNode.h"
#import "FileNode.h"
#import "SmartFolderNode.h"

#import "Logging.h"

@implementation PathNode

// From http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileMgmt/Tasks/ResolvingAliases.html
// Updated 2018-06-28
NSURL *resolveAliases(NSURL *url) {
	CFErrorRef error;
	CFDataRef bookmarkRef = CFURLCreateBookmarkDataFromFile(kCFAllocatorDefault, (__bridge CFURLRef)url, &error);
	if(bookmarkRef) {
		Boolean isStale;
		CFURLRef urlRef = CFURLCreateByResolvingBookmarkData(kCFAllocatorDefault, bookmarkRef, kCFURLBookmarkResolutionWithSecurityScope, NULL, NULL, &isStale, &error);
		CFRelease(bookmarkRef);

		if(urlRef) {
			if(!isStale) {
				return (NSURL *)CFBridgingRelease(urlRef);
			} else {
				CFRelease(urlRef);
			}
		}
	}

	// DLog(@"Not resolved");
	return url;
}

- (id)initWithDataSource:(FileTreeDataSource *)ds url:(NSURL *)u {
	self = [super init];

	if(self) {
		dataSource = ds;
		[self setURL:u];
	}

	return self;
}

- (void)setURL:(NSURL *)u {
	url = u;

	display = [[NSFileManager defaultManager] displayNameAtPath:[u path]];

	icon = [[NSWorkspace sharedWorkspace] iconForFile:[url path]];

	[icon setSize:NSMakeSize(16.0, 16.0)];
}

- (NSURL *)URL {
	return url;
}

- (void)updatePath {
}

- (void)processPaths:(NSArray *)contents {
	NSMutableArray *newSubpathsDirs = [[NSMutableArray alloc] init];
	NSMutableArray *newSubpaths = [[NSMutableArray alloc] init];

	for(NSString *s in contents) {
		if([s characterAtIndex:0] == '.') {
			continue;
		}

		NSURL *u = [NSURL fileURLWithPath:s];
		NSString *displayName = [[NSFileManager defaultManager] displayNameAtPath:[u path]];

		PathNode *newNode;

		// DLog(@"Before: %@", u);
		u = resolveAliases(u);
		// DLog(@"After: %@", u);

		BOOL isDir;

		if([[s pathExtension] caseInsensitiveCompare:@"savedSearch"] == NSOrderedSame) {
			DLog(@"Smart folder!");
			newNode = [[SmartFolderNode alloc] initWithDataSource:dataSource url:u];
			isDir = NO;
		} else {
			[[NSFileManager defaultManager] fileExistsAtPath:[u path] isDirectory:&isDir];

			if(!isDir && ![[AudioPlayer fileTypes] containsObject:[[u pathExtension] lowercaseString]]) {
				continue;
			}

			if(isDir) {
				newNode = [[DirectoryNode alloc] initWithDataSource:dataSource url:u];
			} else if([[AudioPlayer containerTypes] containsObject:[[u pathExtension] lowercaseString]]) {
				newNode = [[ContainerNode alloc] initWithDataSource:dataSource url:u];
			} else {
				newNode = [[FileNode alloc] initWithDataSource:dataSource url:u];
			}
		}

		[newNode setDisplay:displayName];

		if(isDir)
			[newSubpathsDirs addObject:newNode];
		else
			[newSubpaths addObject:newNode];
	}

	[newSubpathsDirs addObjectsFromArray:newSubpaths];
	[self setSubpaths:newSubpathsDirs];
}

- (NSArray *)subpaths {
	if(subpaths == nil) {
		[self updatePath];
	}

	return subpaths;
}

- (void)setSubpaths:(NSArray *)s {
	subpaths = s;
}

- (BOOL)isLeaf {
	return YES;
}

- (void)setDisplay:(NSString *)s {
	display = s;
}

- (NSString *)display {
	return display;
}

- (NSImage *)icon {
	return icon;
}

@end