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

package types

type (
	// vomdata config types
	ConvertGroup	struct{ Name string; PrimaryType typeobject; Values []any }
	VomdataStruct struct{
		EncodeDecodeData map[byte][]any // map from min required VOM version to test values
		CompatData			 map[string][]typeobject
		ConvertData			map[string][]ConvertGroup
	}

	// Named Types
	NBool       bool
	NString     string
	NByteSlice  []byte
	NByteArray  [4]byte
	NByte       byte
	NUint16     uint16
	NUint32     uint32
	NUint64     uint64
	NInt8       int8
	NInt16      int16
	NInt32      int32
	NInt64      int64
	NFloat32    float32
	NFloat64    float64
	NComplex64  complex64
	NComplex128 complex128

	NArray2Uint64    [2]uint64
	NListUint64      []uint64
	NSetUint64       set[uint64]
	NMapUint64String map[uint64]string

	NStruct struct {
		A bool
		B string
		C int64
	}

	NEnum  enum{ A; B; C }
	NUnion union{ A	bool; B string; C int64 }

	// Nested Custom Types
	MBool   NBool
	MStruct struct {
		A bool
		B NBool
		C MBool
		D ?NStruct
		E typeobject
		F any
	}
	MList []NListUint64
	MMap  map[NFloat32]NListUint64
	MByteSlice []byte
	MInt8Slice []int8

	// Recursive Type Definitions
	RecA []RecA
	RecX []RecY
	RecY []RecX
	Rec1 []Rec2
	Rec2 []Rec3
	Rec3 []Rec4
	Rec4 []Rec1
	RecStruct struct {
		A ?RecStruct
	}
	Rec1234 struct {
	    R1 Rec1
	    R2 Rec2
	    R3 Rec3
	    R4 Rec4
	}
	Rec1234A struct {
	    A []Rec1234A
	    Rec1234 []Rec1234
	}
	Rec1234B struct {
	    B []Rec1234B
	    Rec1234 []Rec1234
	}
	Rec1234All struct {
	    A Rec1234A
	    B Rec1234B
	}

	// Additional types for compatibility and conversion checks
	ListString []string
	Array3String [3]string
	Array4String [4]string

	AbcStruct struct {
		A bool
		B string
		C int64
	}
	AdeStruct struct {
		A bool
		D any
		E typeobject
	}

	XyzStruct struct {
		X bool
		Y MBool
		Z string
	}
	YzStruct struct {
		Y NBool
		Z NString
	}
	ZStruct struct {
		Z string
	}

	MapOnlyStruct struct {
		Key1 int64
		Key2 uint32
		Key3 complex128
	}
	StructOnlyMap map[string]uint64

	MapSetStruct struct {
		Feat bool
		Tire bool
		Eel  bool
	}
	SetStructMap map[string]bool
	MapStructSet set[string]

	SetOnlyMap      map[float64]bool
	SometimesSetMap map[float64]any
	MapOnlySet      set[float64]

	SetOnlyA  set[bool]
	SetOnlyA2 set[NBool]
	SetOnlyB  set[int16]
	SetOnlyB2 set[NInt16]

	MapOnlyA  map[uint32]uint32
	MapOnlyA2 map[int64]float64
	MapOnlyB  map[bool]string
	MapOnlyB2 map[NBool]NString

	BdeUnion union{ B string; D any; E typeobject }

	BrieEnum enum{ Glee; Brie; Three }
	BeanEnum enum{ Bean }
	FoodEnum enum{ Bean; Brie; Cherry }

	StructAny struct {
		Any any
	}

	StructMap struct {
		Map map[int64]int64
	}

	// Since the encoding changes if struct fields are zero values,
	// test each of the kinds in a struct both as zero and non-zero values.
	StructManyTypes struct {
		Bool bool
		AByte byte
		Int16 int16
		Int32 int32
		Int64 int64
		Uint16 uint16
		Uint32 uint32
		Uint64 uint64
		String string
		Bytes []byte
		Float32 float32
		Float64 float64
		Complex64 complex64
		Complex128 complex128
		FoodEnum FoodEnum
		NEnum NEnum
		NListUint64 NListUint64
		NByteArray NByteArray
		NArray2Uint64 NArray2Uint64
		NSetUint64 NSetUint64
		NMapUint64String NMapUint64String
		NStruct NStruct
		NUnion NUnion
		TypeObject typeobject
	}

	AnySlice []any

	LargeMessageType struct {
		Payload []byte
		Next ?LargeMessageType
	}

	LargeAnyMessageType struct {
		Payload any
		Next ?LargeAnyMessageType
	}
)
