// 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.

// +build darwin,ios

package swift

import (
	"unsafe"

	"v.io/x/lib/vlog"

	// TODO Make this pluggable somehow
	_ "v.io/x/ref/runtime/factories/roaming"

	sgoogle "v.io/x/swift/impl/google"
	sutil "v.io/x/swift/util"
	sv23 "v.io/x/swift/v23"
)

//#import "types.h"
import "C"

//export swift_io_v_v23_V_nativeInitGlobal
func swift_io_v_v23_V_nativeInitGlobal(errOut *C.SwiftVError) {
	// Send all vlog logs to stderr during the init so that we don't crash on android trying
	// to create a log file.  These settings will be overwritten in nativeInitLogging below.
	vlog.Log.Configure(vlog.OverridePriorConfiguration(true), vlog.LogToStderr(true))

	if err := sv23.Init(); err != nil {
		sutil.ThrowSwiftError(nil, err, unsafe.Pointer(errOut))
		return
	}
	if err := sgoogle.Init(); err != nil {
		sutil.ThrowSwiftError(nil, err, unsafe.Pointer(errOut))
		return
	}
}

//export swift_io_v_v23_V_nativeInitLogging
func swift_io_v_v23_V_nativeInitLogging(logDir *C.char, logToStderr bool, logLevel int, moduleSpec *C.char, errOut *C.SwiftVError) {
	dir, toStderr, level, vmodule, err := loggingOpts(C.GoString(logDir), logToStderr, logLevel, C.GoString(moduleSpec))
	if err != nil {
		sutil.ThrowSwiftError(nil, err, unsafe.Pointer(errOut))
		return
	}

	vlog.Log.Configure(vlog.OverridePriorConfiguration(true), dir, toStderr, level, vmodule)
}

func loggingOpts(logDir string, logToStderr bool, logLevel int, moduleSpec string) (dir vlog.LogDir, toStderr vlog.LogToStderr, level vlog.Level, vmodule vlog.ModuleSpec, err error) {
	dir = vlog.LogDir(logDir)
	toStderr = vlog.LogToStderr(logToStderr)
	level = vlog.Level(logLevel)
	err = vmodule.Set(moduleSpec)
	return
}
