// 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 base is a simple single-file test of vdl functionality.
package base

type (
	NamedBool       bool
	NamedByte       byte
	NamedUint16     uint16
	NamedUint32     uint32
	NamedUint64     uint64
	NamedInt8       int8
	NamedInt16      int16
	NamedInt32      int32
	NamedInt64      int64
	NamedFloat32    float32
	NamedFloat64    float64
	NamedComplex64  complex64
	NamedComplex128 complex128
	NamedString     string
	NamedEnum       enum{A;B;C}
	NamedArray      [2]bool
	NamedList       []uint32
	NamedSet        set[string]
	NamedMap        map[string]float32
	NamedStruct     struct{A bool;B string;C int32}
	NamedUnion      union{A bool;B string;C int32}
)

type Scalars struct {
	A0  bool
	A1  byte
	A2  uint16
	A3  uint32
	A4  uint64
	A5  int8
	A6  int16
	A7  int32
	A8  int64
	A9  float32
	A10  float64
	A11 complex64
	A12 complex128
	A13 string
	A14 error
	A15 any
	A16 typeobject

	B0  NamedBool
	B1  NamedByte
	B2  NamedUint16
	B3  NamedUint32
	B4  NamedUint64
	B5  NamedInt8
	B6  NamedInt16
	B7  NamedInt32
	B8  NamedInt64
	B9  NamedFloat32
	B10  NamedFloat64
	B11 NamedComplex64
	B12 NamedComplex128
	B13 NamedString
	B14 NamedEnum
	B15 NamedUnion
}

// These are all scalars that may be used as map or set keys.
type KeyScalars struct {
	A0  bool
	A1  byte
	A2  uint16
	A3  uint32
	A4  uint64
	A5  int8
	A6  int16
	A7  int32
	A8  int64
	A9  float32
	A10  float64
	A11 complex64
	A12 complex128
	A13 string

	B0  NamedBool
	B1  NamedByte
	B2  NamedUint16
	B3  NamedUint32
	B4  NamedUint64
	B5  NamedInt8
	B6  NamedInt16
	B7  NamedInt32
	B8  NamedInt64
	B9  NamedFloat32
	B10  NamedFloat64
	B11 NamedComplex64
	B12 NamedComplex128
	B13 NamedString
}

type ScalarsArray [2]Scalars

type Composites struct {
	A0 Scalars
	A1 ScalarsArray
	A2 []Scalars
	A3 set[KeyScalars]
	A4 map[string]Scalars
	A5 map[KeyScalars][]map[string]complex128
}

type CompositesArray [2]Composites

type CompComp struct {
	A0 Composites
	A1 CompositesArray
	A2 []Composites
	A3 map[string]Composites
	A4 map[KeyScalars][]map[string]Composites
}

// NestedArgs is defined before Args; that's allowed in regular Go, and also
// allowed in our vdl files.  The compiler will re-order dependent types to ease
// code generation in other languages.
type NestedArgs struct {
	Args Args
}

// Args will be reordered to show up before NestedArgs in the generated output.
type Args struct {
	A int32
	B int32
}

const (
	Cbool = true
	Cbyte = byte(1)
	Cint32 = int32(2)
	Cint64 = int64(3)
	Cuint32 = uint32(4)
	Cuint64 = uint64(5)
	Cfloat32 = float32(6)
	Cfloat64 = float64(7)
	CNamedBool = NamedBool(true)
	CNamedStruct = NamedStruct{A:true, B: "test",}
	Ccomplex64 = complex64(8+9i)
	Ccomplex128 = complex128(10+11i)
	Cstring = "foo"
	Cenum  = NamedEnum.A
	Cunion = NamedUnion{A: true}
	Carray = NamedArray{true, false}
	Clist  = []int32{1, 2, 3}
	Cset   = set[int32]{1, 2, 3}
	cmap   = map[int32]string{1: "A", 2: "B", 3: "C"}
	Cargs  = Args{1, 2}

	CScalars = Scalars{
		A0: true,
		A1: 1,
		A2: 2,
		A3: 3,
		A4: 4,
		A5: 5,
		A6: 6,
		A7: 7,
		A8: 8,
		A9: 9,
		A10: 10,
		A11: 11,
		A12: 12,
		A13: "abc",
		A15: false,
		A16: typeobject(bool),

		B0: true,
		B1: 1,
		B2: 2,
		B3: 3,
		B4: 4,
		B5: 5,
		B6: 6,
		B7: 7,
		B8: 8,
		B9: 9,
		B10: 10,
		B11: 11,
		B12: 12,
		B13: "abc",
		B14: NamedEnum.B,
		B15: NamedUnion{C: 123},
	}

	True = true
	Foo = "foo"
	Five = int32(5)
	SixSquared = Six*Six
	FiveSquared = Five*Five
	Six = uint64(6)

	CTypeObject_bool       = typeobject(bool)
	CTypeObject_string     = typeobject(string)
	CTypeObject_bytes      = typeobject([]byte)
	CTypeObject_byte       = typeobject(byte)
	CTypeObject_uint16     = typeobject(uint16)
	CTypeObject_int8       = typeobject(int8)
	CTypeObject_int16      = typeobject(int16)
	CTypeObject_float32    = typeobject(float32)
	CTypeObject_complex64  = typeobject(complex64)
	CTypeObject_enum       = typeobject(NamedEnum)
	CTypeObject_Array      = typeobject(NamedArray)
	CTypeObject_List       = typeobject([]string)
	CTypeObject_Set        = typeobject(set[string])
	CTypeObject_Map        = typeobject(map[string]int64)
	CTypeObject_Struct     = typeobject(Scalars)
	CTypeObject_Union      = typeobject(NamedUnion)
	CTypeObject_TypeObject = typeobject(typeobject)
	CTypeObject_Any        = typeobject(any)
)

type ServiceA interface {
	MethodA1() error
	MethodA2(a int32, b string) (s string | error)
	MethodA3(a int32) stream<_, Scalars> (s string | error) {"tag", Six}
	MethodA4(a int32) stream<int32, string> error
}

type ServiceB interface {
	ServiceA
	MethodB1(a Scalars, b Composites) (c CompComp | error)
}

// Error definitions, which allow stable error-checking across different address
// spaces.
error (
	NoParams1() {"en":"en msg"}
	NoParams2() {RetryRefetch, "en":"en msg", "fr":"fr msg"}

	WithParams1(x string, y int32) {"en":"en x={x} y={y}"}
	WithParams2(x string, y int32) {
		RetryRefetch,
		"en":"en x={x} y={y}",
		"fr":"fr y={y} x={x}",
	}

	notExported(x string, y int32) {"en":"en x={x} y={y}"}
)
