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

import (
	"unsafe"

	"v.io/v23/context"
	"v.io/v23/verror"
)

/*
#include "../types.h"

// Because of weirdness with function pointers & cgo, we hack around limitations by defining methods that just call
// C function pointers here. Go can call these functions directly.

typedef void (*fxn_AsyncId)(AsyncCallbackIdentifier);
typedef void (*fxn_AsyncId_GoHandle)(AsyncCallbackIdentifier, _GoHandle);
typedef void (*fxn_AsyncId_SwiftByteArrayArray)(AsyncCallbackIdentifier, SwiftByteArrayArray);
typedef void (*fxn_AsyncId_SwiftVError)(AsyncCallbackIdentifier, SwiftVError);

static void callFxn_AsyncId(fxn_AsyncId fxnPtr, AsyncCallbackIdentifier a) {
	fxnPtr(a);
}

static void callFxn_AsyncId_GoHandle(fxn_AsyncId_GoHandle fxnPtr, AsyncCallbackIdentifier a, _GoHandle b) {
	fxnPtr(a, b);
}

static void callFxn_AsyncId_SwiftByteArrayArray(
		fxn_AsyncId_SwiftByteArrayArray fxnPtr, AsyncCallbackIdentifier a, SwiftByteArrayArray b) {
	fxnPtr(a, b);
}

static void callFxn_AsyncId_SwiftVError(fxn_AsyncId_SwiftVError fxnPtr, AsyncCallbackIdentifier a, SwiftVError b) {
	fxnPtr(a, b);
}
*/
import "C"

func ThrowSwiftError(ctx *context.T, err error, swiftVErrorStructPtr unsafe.Pointer) {
	id := verror.ErrorID(err)
	actionCode := verror.Action(err)
	vErr := verror.Convert(verror.IDAction{id, actionCode}, ctx, err)
	pcs := verror.Stack(vErr)
	stacktrace := pcs.String()
	msg := vErr.Error()

	var swiftErrorPtr *C.SwiftVError = (*C.SwiftVError)(swiftVErrorStructPtr)
	(*swiftErrorPtr).identity = C.CString((string)(id))
	(*swiftErrorPtr).actionCode = C._GoUint32(actionCode)
	(*swiftErrorPtr).msg = C.CString(msg)
	(*swiftErrorPtr).stacktrace = C.CString(stacktrace)
}

func DoSuccessCallback(successPtr unsafe.Pointer, asyncId int32) {
	C.callFxn_AsyncId(
		(C.fxn_AsyncId)(successPtr),
		(C.AsyncCallbackIdentifier)(asyncId))
}

func DoSuccessHandlerCallback(successPtr unsafe.Pointer, asyncId int32, handler uint64) {
	C.callFxn_AsyncId_GoHandle(
		(C.fxn_AsyncId_GoHandle)(successPtr),
		(C.AsyncCallbackIdentifier)(asyncId),
		(C._GoHandle)(handler))
}

func DoSuccessByteArrayArrayCallback(successPtr unsafe.Pointer, asyncId int32, swiftByteArrayArrayPtr unsafe.Pointer) {
	var byteArrayArray C.SwiftByteArrayArray = *(*C.SwiftByteArrayArray)(swiftByteArrayArrayPtr)
	C.callFxn_AsyncId_SwiftByteArrayArray(
		(C.fxn_AsyncId_SwiftByteArrayArray)(successPtr),
		(C.AsyncCallbackIdentifier)(asyncId),
		(C.SwiftByteArrayArray)(byteArrayArray))
}

func DoFailureCallback(failurePtr unsafe.Pointer, asyncId int32, swiftVErrorStructPtr unsafe.Pointer) {
	var swiftError C.SwiftVError = *(*C.SwiftVError)(swiftVErrorStructPtr)
	C.callFxn_AsyncId_SwiftVError(
		(C.fxn_AsyncId_SwiftVError)(failurePtr),
		(C.AsyncCallbackIdentifier)(asyncId),
		swiftError)
}
