// Copyright 2015 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))
    try SwiftVError.catchAndThrowError { errPtr in
      swift_io_v_v23_V_nativeInitGlobal(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 {
    instance = try V23(loggingOptions: loggingOptions ?? VLoggingOptions())
  }
  
  public var context: Context {
    get {
      return rootContext
    }
  }
}