//
//  Ample.m
//  Ample
//
//  Created by Kelvin Sherlock on 9/1/2020.
//  Copyright © 2020 Kelvin Sherlock. All rights reserved.
//

#include "Ample.h"

NSURL *SupportDirectory(void) {
    static NSURL *cached = nil;
    
    if (!cached) {
        NSFileManager *fm = [NSFileManager defaultManager];
        NSError *error = nil;

        NSURL *url = [fm URLForDirectory: NSApplicationSupportDirectory inDomain: NSUserDomainMask appropriateForURL: nil create: YES error: &error];
        cached = [url URLByAppendingPathComponent: @"Ample"];
        
        [fm createDirectoryAtURL: cached withIntermediateDirectories: YES attributes: nil error: &error];
    }
    return cached;
    
}

NSString *SupportDirectoryPath(void) {
    static NSString *cached = nil;
    
    if (!cached) {
        NSURL *url = SupportDirectory();
        cached = [NSString stringWithCString: [url fileSystemRepresentation] encoding: NSUTF8StringEncoding];
    }
    return cached;
}


NSURL *MameURL(void) {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSBundle *bundle = [NSBundle mainBundle];
        
    if ([defaults boolForKey: kUseCustomMame]) {
        NSString *path = [defaults stringForKey: kMamePath];
        if ([path length]) return [NSURL fileURLWithPath: path];
    }
    
    return [bundle URLForAuxiliaryExecutable: @"mame64"];
}

NSString *MamePath(void) {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSBundle *bundle = [NSBundle mainBundle];

    NSString *path;
    
    if ([defaults boolForKey: kUseCustomMame]) {
        path = [defaults stringForKey: kMamePath];
        if ([path length]) return path;
    }
    path = [bundle pathForAuxiliaryExecutable: @"mame64"];
    if ([path length]) return path;
    return nil;
}


NSURL *MameWorkingDirectory(void) {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        
    if ([defaults boolForKey: kUseCustomMame]) {
        NSString *path = [defaults stringForKey: kMameWorkingDirectory];
        if (![path length]) return [NSURL fileURLWithPath: path];
    }
    
    return SupportDirectory();
}

NSString *MameWorkingDirectoryPath(void) {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        
    if ([defaults boolForKey: kUseCustomMame]) {
        NSString *path = [defaults stringForKey: kMameWorkingDirectory];
        if (![path length]) return path;
    }
    
    return SupportDirectoryPath();
}


NSDictionary *MameMachine(NSString *machine) {
    static NSMutableDictionary *cache;
    
    if (!cache) cache = [NSMutableDictionary new];
    NSDictionary *d;
    
    if (!machine) return nil;
    d = [cache objectForKey: machine];
    if (d) return d;

    NSBundle *bundle = [NSBundle mainBundle];
    NSURL *url= [bundle URLForResource: machine withExtension: @"plist"];
    
    d = [NSDictionary dictionaryWithContentsOfURL: url];
    if (d) [cache setObject: d forKey: machine];
    return d;
}

/* NSCache doesn't retain it's key. This essentially interns it. */
/* could just abuse NSSelectorFromString() */
NSString *InternString(NSString *key) {
    static NSMutableSet *storage = nil;
    
    if (!storage) {
        storage = [NSMutableSet new];
    }
    NSString *copy = [storage member: key];
    if (!copy) {
        copy = [key copy];
        [storage addObject: copy];
    }
    return copy;
}


NSString *kUseCustomMame = @"UseCustomMame";
NSString *kMamePath = @"MamePath";
NSString *kMameWorkingDirectory = @"MameWorkingDirectory";
NSString *kAutoCloseLogWindow = @"AutoCloseLogWindow";
NSString *kUseLogWindow = @"UseLogWindow";
NSString *kMameComponentsDate = @"MameComponentsDate";
NSString *kDefaultDownloadURL = @"DefaultDownloadURL";
NSString *kDefaultDownloadExtension = @"DefaultDownloadExtension";

NSString *kDownloadURL = @"DownloadURL";
NSString *kDownloadExtension = @"DownloadExtension";

NSString *kNotificationDiskImageAdded = @"Disk Image Added";
NSString *kNotificationDiskImageMagicRoute = @"Disk Image Magic Route";
NSString *kNotificationBookmarkMagicRoute = @"Bookmark Magic Route";
