// Copyright 2018 The Go 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 fuchsia

package fidl

import (
	"sync"

	"syscall/zx"
)

const TransactionHeaderFlag_UnionFromXunionBytes = 1 << 0

const FidlWireFormatMagicNumberInitial = 1

// messageBytesPool is a pool of buffers that can fit the data part of any
// FIDL message.
var messageBytesPool = sync.Pool{
	New: func() interface{} {
		return make([]byte, zx.ChannelMaxMessageBytes)
	},
}

// messageHandlesPool is a pool of buffers that can fit the handles part of
// any FIDL message.
var messageHandlesPool = sync.Pool{
	New: func() interface{} {
		return make([]zx.Handle, zx.ChannelMaxMessageHandles)
	},
}

// MessageHeader represents a transactional message header.
type MessageHeader struct {
	_       struct{} `fidl:"s,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Txid    uint32   `fidl:"0"`
	Flags   [3]uint8 `fidl:"4"`
	Magic   uint8    `fidl:"7"`
	Ordinal uint64   `fidl:"8"`
}

var mMessageHeader = MustCreateMarshaler(MessageHeader{})

var MessageHeaderSize = 16

func (msg *MessageHeader) Marshaler() Marshaler {
	return mMessageHeader
}

// MarshalHeaderThenMessage marshals a transactional message
// (see https://fuchsia.googlesource.com/fuchsia/+/master/docs/development/languages/fidl/reference/wire-format/README.md#messages-for-transactions).
// It marshals a `MessageHeader`, optionally followed by a `Message` (body).
func MarshalHeaderThenMessage(header *MessageHeader, body Message, data []byte, handles []zx.Handle) (int, int, error) {
	hnb, _, err := Marshal(header, data, nil)
	if err != nil {
		return 0, 0, err
	}
	if body == nil {
		return hnb, 0, nil
	}
	nb, nh, err := Marshal(body, data[hnb:], handles)
	if err != nil {
		return 0, 0, err
	}
	return hnb + nb, nh, nil
}

// UnmarshalHeaderThenMessage unmarshals a transactional message
// (see https://fuchsia.googlesource.com/fuchsia/+/master/docs/development/languages/fidl/reference/wire-format/README.md#messages-for-transactions).
// It unmarshals a `MessageHeader`, optionally followed by a `Message` (body).
func UnmarshalHeaderThenMessage(data []byte, handles []zx.Handle, header *MessageHeader, body Message) error {
	hnb, _, err := Unmarshal(data, nil, header)
	if err != nil {
		return err
	}
	if body == nil {
		return nil
	}
	ctx := MarshalerContext{
		DecodeUnionsFromXUnionBytes: shouldDecodeUnionsFromXUnionBytes(header),
	}
	if _, _, err := UnmarshalWithContext(ctx, data[hnb:], handles, body); err != nil {
		return err
	}
	return nil
}

func shouldDecodeUnionsFromXUnionBytes(header *MessageHeader) bool {
	return headerHasFlag(header, TransactionHeaderFlag_UnionFromXunionBytes)
}

func headerHasFlag(header *MessageHeader, flag int) bool {
	headerFlags := int(header.Flags[2])<<16 + int(header.Flags[1])<<8 + int(header.Flags[0])
	return (headerFlags & flag) != 0
}
