// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

import Foundation

public func configure(loggingOptions:VLoggingOptions?=nil) throws {
  try V23.configure(loggingOptions)
}

public let instance = V23.instance

public class V23 {
  private static var _instance: V23? = nil
  private var rootContext:Context

  /// The singleton instance of V23 that you use to create and configure any clients/servers.
  ///
  /// **Warning:** You must first call configure before you can grab an instance. It will
  /// crash with a fatalError otherwise.
  public static var instance: V23 {
    get {
      if (_instance == nil) {
        fatalError("You must first call V23.configure before you can use an instance")
      }
      return _instance!
    }
    set {
      if (_instance != nil) {
        fatalError("You cannot create another instance of V23")
      }
      _instance = newValue
    }
  }

  /// Private constructor for V23.
  private init(loggingOptions:VLoggingOptions) throws {
    // We must have all variables initialized before we can throw
    rootContext = Context(handle: ContextHandle(0))

    let appSupportUrl = NSURL(fileURLWithPath:
      NSSearchPathForDirectoriesInDomains(.ApplicationSupportDirectory, .UserDomainMask, true)[0])
    let v23Url = appSupportUrl.URLByAppendingPathComponent("Vanadium")
    let credentialsPath = v23Url.path!
    log.debug("Using credentials path \(credentialsPath)")
    if !NSFileManager.defaultManager().fileExistsAtPath(credentialsPath) {
      // Create it
      let attrs = [NSFileProtectionKey: NSFileProtectionCompleteUntilFirstUserAuthentication]
      try NSFileManager.defaultManager().createDirectoryAtPath(
        credentialsPath, withIntermediateDirectories: true, attributes: attrs)
    }
    try SwiftVError.catchAndThrowError { errPtr in
      swift_io_v_v23_V_nativeInitGlobal(credentialsPath.toGo(), errPtr)
    }

    try loggingOptions.initGo()
    rootContext = Context(handle: ContextHandle(swift_io_v_impl_google_rt_VRuntimeImpl_nativeInit()))
  }

  deinit {
    swift_io_v_impl_google_rt_VRuntimeImpl_nativeShutdown(rootContext.handle.goHandle)
  }

  /// You must call configure before using Vanadium or grabbing an instance.
  /// This is where you pass any logging options... (TBD)
  ///
  /// **Warning:** You may only call this once. It will otherwise crash with a fatalError.
  ///
  /// :param: loggingOptions Logging options used by the Vandadium internals.
  ///         See documentation on VLoggingOptions for more information
  public class func configure(loggingOptions:VLoggingOptions?=nil) throws {
    if _instance == nil {
      instance = try V23(loggingOptions: loggingOptions ?? VLoggingOptions())
    }
  }

  public var context: Context {
    get {
      return rootContext
    }
  }

  /// Shutdown will shutdown the root V23 context and runtime, removing the instance from memory.
  public func shutdown() {
    V23._instance = nil
  }
}