package go2ts

import (
	"bytes"
	"image/color"
	"reflect"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/jsonutils"
)

func TestRender_ComplexStruct_Success(t *testing.T) {

	type OtherStruct struct {
		T time.Time `json:"t,omitempty"`
	}

	type InnermostStruct struct {
		InnermostField string
	}

	type StructWithEmbeddedStruct struct {
		InnermostStruct
		Field string
	}

	type StructWithEmbeddedStructPtr struct {
		*InnermostStruct
		Field string
	}

	type AnotherInnermostStruct struct {
		AnotherInnermostField string
	}

	type MultilevelEmbeddedStruct struct {
		*StructWithEmbeddedStruct
		AnotherInnermostStruct
		OutermostField string
	}

	type StructWithSomeFieldsForcedToStrings struct {
		BoolAsString                              bool             `json:",string"`
		IntAsString                               int              `json:",string"`
		Int64AsStringOmitEmpty                    int              `json:"id_string_omitempty,string,omitempty"`
		Int64AsStringOmitEmptyReversedOptionOrder int              `json:"id_omitempty_string,omitempty,string"`
		Uint8NotAsAString                         uint8            `json:"string,"` // Ensure we don't mistakenly use the tag name.
		SerializesToString                        jsonutils.Number `go2ts:"string"`
	}

	// This struct shows that the outermost fields in embedded structs always take precedence,
	// regardless of whether the overlapping field appears before or after the struct.
	type StructWithOverlappingEmbeddedStructs struct {
		InnermostStruct
		InnermostField        int // Overlaps with InnermostStruct, but has a different type.
		AnotherInnermostField int // Overlaps with AnotherInnermostStruct, but has a different type.
		AnotherInnermostStruct
	}

	type RecursiveStruct struct {
		Field                   string
		Recursion               *RecursiveStruct
		RecursionIgnoreNil      *RecursiveStruct `go2ts:"ignorenil"`
		RecursionSlice          []RecursiveStruct
		RecursionSliceIgnoreNil []RecursiveStruct `go2ts:"ignorenil"`
	}

	type Mode string

	type Offset int

	type Direction string

	const (
		Up    Direction = "up"
		Down  Direction = "down"
		Left  Direction = "left"
		Right Direction = "right"
	)

	var AllDirections = []Direction{Up, Down, Left, Right}

	type AppleVariety string

	const (
		Gala       AppleVariety = "gala"
		Honeycrisp AppleVariety = "honeycrisp"
	)

	var AllAppleVarieties = []AppleVariety{Honeycrisp, Gala}

	type OrangeVariety string

	const (
		Bergamot   OrangeVariety = "bergamot"
		Clementine OrangeVariety = "clementine"
	)

	var AllOrangeVarieties = []OrangeVariety{Bergamot, Clementine}

	type YearlyYield map[int]int

	type Farm struct {
		Name  string
		Stats YearlyYield
	}

	type AppleOrchard struct {
		Farm    Farm
		Variety AppleVariety
	}

	type Data map[string]interface{}

	type ParamSet map[string][]string

	type ParamSetIgnoreNil map[string][]string

	type ComplexStruct struct {
		String                               string
		StringWithAnnotation                 string `json:"s"`
		Bool                                 bool
		Int                                  int
		Float64                              float64
		Time                                 time.Time
		Other                                OtherStruct
		OtherPtr                             *OtherStruct
		WithEmbeddedStruct                   StructWithEmbeddedStruct
		WithEmbeddedStructPtr                StructWithEmbeddedStructPtr
		MultilevelEmbedded                   MultilevelEmbeddedStruct
		StructWithSomeFieldsForcedToStrings  StructWithSomeFieldsForcedToStrings
		StructWithOverlappingEmbeddedStructs StructWithOverlappingEmbeddedStructs
		RecursiveStruct                      RecursiveStruct
		OptionalString                       string       `json:",omitempty"`
		OptionalInt                          int          `json:",omitempty"`
		OptionalFloat64                      float64      `json:",omitempty"`
		OptionalTime                         time.Time    `json:",omitempty"`
		OptionalOtherStruct                  OtherStruct  `json:",omitempty"`
		OptionalOtherStructPtr               *OtherStruct `json:",omitempty"`
		OptionalOtherStructPtrIgnoreNil      *OtherStruct `json:",omitempty" go2ts:"ignorenil"`
		Data                                 Data
		DataPtr                              *Data
		ParamSet                             ParamSet
		ParamSetIgnoreNil                    ParamSetIgnoreNil `go2ts:"ignorenil"`
		MapString                            map[string]string
		MapStringIgnoreNil                   map[string]string `go2ts:"ignorenil"`
		MapStringSlice                       map[string][]string
		MapStringSliceIgnoreNil              map[string][]string `go2ts:"ignorenil"`
		MapStringSliceSlice                  map[string][][]string
		MapStringSliceSliceIgnoreNil         map[string][][]string `go2ts:"ignorenil"`
		MapStringPtrSlice                    map[string][]*string
		MapStringPtrSliceIgnoreNil           map[string][]*string `go2ts:"ignorenil"`
		MapIntKeys                           map[int]string
		MapStringAliasKeys                   map[Mode]string
		MapIntAliasKeys                      map[Offset]string
		MapOtherStruct                       map[string]OtherStruct
		MapOtherStructPtr                    map[string]*OtherStruct
		Slice                                []string
		SliceIgnoreNil                       []string `go2ts:"ignorenil"`
		SliceOfSlice                         [][]string
		SliceOfSliceIgnoreNil                [][]string `go2ts:"ignorenil"`
		SliceOfData                          []Data
		MapOfData                            map[string]Data
		MapOfSliceOfData                     map[string][]Data
		MapOfMapOfSliceOfData                map[string]map[string][]Data
		Mode                                 Mode
		InlineStruct                         struct{ A int }
		Array                                [3]string
		skipped                              bool
		Offset                               Offset
		Color                                color.Alpha
		Direction                            Direction
		AppleVariety                         AppleVariety
		OrangeVariety                        OrangeVariety
		AppleOrchard                         AppleOrchard
		NotSerialized                        string `json:"-"`
	}

	const complexStructExpected = `// DO NOT EDIT. This file is automatically generated.

export namespace apple {
	export interface Farm {
		Name: string;
		Stats: apple.YearlyYield;
	}
}

export namespace apple {
	export interface Orchard {
		Farm: apple.Farm;
		Variety: apple.Variety;
	}
}

export interface OtherStruct {
	t?: string;
}

export interface StructWithEmbeddedStruct {
	Field: string;
	InnermostField: string;
}

export interface StructWithEmbeddedStructPtr {
	Field: string;
	InnermostField?: string;
}

export interface MultilevelEmbeddedStruct {
	OutermostField: string;
	Field?: string;
	InnermostField?: string;
	AnotherInnermostField: string;
}

export interface StructWithSomeFieldsForcedToStrings {
	BoolAsString: string;
	IntAsString: string;
	id_string_omitempty?: string;
	id_omitempty_string?: string;
	string: number;
	SerializesToString: Number;
}

export interface StructWithOverlappingEmbeddedStructs {
	InnermostField: number;
	AnotherInnermostField: number;
}

export interface RecursiveStruct {
	Field: string;
	Recursion: RecursiveStruct | null;
	RecursionIgnoreNil: RecursiveStruct;
	RecursionSlice: RecursiveStruct[] | null;
	RecursionSliceIgnoreNil: RecursiveStruct[];
}

export interface Anonymous1 {
	A: number;
}

export interface Alpha {
	A: number;
}

export interface ComplexStruct {
	String: string;
	s: string;
	Bool: boolean;
	Int: number;
	Float64: number;
	Time: string;
	Other: OtherStruct;
	OtherPtr: OtherStruct | null;
	WithEmbeddedStruct: StructWithEmbeddedStruct;
	WithEmbeddedStructPtr: StructWithEmbeddedStructPtr;
	MultilevelEmbedded: MultilevelEmbeddedStruct;
	StructWithSomeFieldsForcedToStrings: StructWithSomeFieldsForcedToStrings;
	StructWithOverlappingEmbeddedStructs: StructWithOverlappingEmbeddedStructs;
	RecursiveStruct: RecursiveStruct;
	OptionalString?: string;
	OptionalInt?: number;
	OptionalFloat64?: number;
	OptionalTime?: string;
	OptionalOtherStruct?: OtherStruct;
	OptionalOtherStructPtr?: OtherStruct | null;
	OptionalOtherStructPtrIgnoreNil?: OtherStruct;
	Data: Data;
	DataPtr: Data | null;
	ParamSet: ParamSet;
	ParamSetIgnoreNil: ParamSetIgnoreNil;
	MapString: { [key: string]: string } | null;
	MapStringIgnoreNil: { [key: string]: string };
	MapStringSlice: { [key: string]: string[] | null } | null;
	MapStringSliceIgnoreNil: { [key: string]: string[] };
	MapStringSliceSlice: { [key: string]: (string[] | null)[] | null } | null;
	MapStringSliceSliceIgnoreNil: { [key: string]: string[][] };
	MapStringPtrSlice: { [key: string]: (string | null)[] | null } | null;
	MapStringPtrSliceIgnoreNil: { [key: string]: string[] };
	MapIntKeys: { [key: number]: string } | null;
	MapStringAliasKeys: { [key: string]: string } | null;
	MapIntAliasKeys: { [key: number]: string } | null;
	MapOtherStruct: { [key: string]: OtherStruct } | null;
	MapOtherStructPtr: { [key: string]: OtherStruct | null } | null;
	Slice: string[] | null;
	SliceIgnoreNil: string[];
	SliceOfSlice: (string[] | null)[] | null;
	SliceOfSliceIgnoreNil: string[][];
	SliceOfData: Data[] | null;
	MapOfData: { [key: string]: Data } | null;
	MapOfSliceOfData: { [key: string]: Data[] | null } | null;
	MapOfMapOfSliceOfData: { [key: string]: { [key: string]: Data[] | null } | null } | null;
	Mode: Mode;
	InlineStruct: Anonymous1;
	Array: string[];
	Offset: Offset;
	Color: Alpha;
	Direction: Direction;
	AppleVariety: apple.Variety;
	OrangeVariety: orange.Variety;
	AppleOrchard: apple.Orchard;
}

export namespace apple { export type YearlyYield = { [key: number]: number } | null; }

export namespace apple { export type Variety = 'honeycrisp' | 'gala'; }

export type Number = string & {
	/**
	* WARNING: Do not reference this field from application code.
	*
	* This field exists solely to provide nominal typing. For reference, see
	* https://www.typescriptlang.org/play#example/nominal-typing.
	*/
	_numberBrand: 'type alias for string'
};

export function Number(v: string): Number {
	return v as Number;
};

export type Data = { [key: string]: any } | null;

export type ParamSet = { [key: string]: string[] | null } | null;

export type ParamSetIgnoreNil = { [key: string]: string[] } & {
	/**
	* WARNING: Do not reference this field from application code.
	*
	* This field exists solely to provide nominal typing. For reference, see
	* https://www.typescriptlang.org/play#example/nominal-typing.
	*/
	_paramSetIgnoreNilBrand: 'type alias for { [key: string]: string[] }'
};

export function ParamSetIgnoreNil(v: { [key: string]: string[] }): ParamSetIgnoreNil {
	return v as ParamSetIgnoreNil;
};

export type Mode = string & {
	/**
	* WARNING: Do not reference this field from application code.
	*
	* This field exists solely to provide nominal typing. For reference, see
	* https://www.typescriptlang.org/play#example/nominal-typing.
	*/
	_modeBrand: 'type alias for string'
};

export function Mode(v: string): Mode {
	return v as Mode;
};

export type Offset = number & {
	/**
	* WARNING: Do not reference this field from application code.
	*
	* This field exists solely to provide nominal typing. For reference, see
	* https://www.typescriptlang.org/play#example/nominal-typing.
	*/
	_offsetBrand: 'type alias for number'
};

export function Offset(v: number): Offset {
	return v as Offset;
};

export type Direction = 'up' | 'down' | 'left' | 'right';

export namespace orange { export type Variety = 'bergamot' | 'clementine'; }
`

	go2ts := New()
	go2ts.GenerateNominalTypes = true

	go2ts.AddWithNameToNamespace(AppleOrchard{}, "Orchard", "apple")
	go2ts.Add(ComplexStruct{})
	go2ts.AddUnion(AllDirections)
	go2ts.AddUnion(AllDirections)
	go2ts.AddUnionWithNameToNamespace(AllAppleVarieties, "Variety", "apple")
	go2ts.AddUnionWithNameToNamespace(AllOrangeVarieties, "Variety", "orange")
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)

	assert.Equal(t, complexStructExpected, b.String())
}

func TestRender_NoTypesAdded_ReturnsEmptyString(t *testing.T) {
	go2ts := New()
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	assert.Equal(t, "// DO NOT EDIT. This file is automatically generated.\n", b.String())
}

func TestRender_SameTypeAddedInMultipleWays_RendersTypeOnce(t *testing.T) {
	type SomeStruct struct {
		B string
	}

	go2ts := New()
	go2ts.Add(reflect.TypeOf(SomeStruct{}))
	go2ts.AddWithName(SomeStruct{}, "ADifferentName")
	go2ts.Add(reflect.TypeOf([]SomeStruct{}).Elem())
	go2ts.Add(SomeStruct{})
	go2ts.Add(&SomeStruct{})
	go2ts.Add(reflect.New(reflect.TypeOf(SomeStruct{})))
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export interface SomeStruct {
	B: string;
}
`
	assert.Equal(t, expected, b.String())
}

func TestRender_FirstAddDeterminesInterfaceName(t *testing.T) {
	type SomeStruct struct {
		B string
	}

	go2ts := New()
	go2ts.AddWithName(SomeStruct{}, "ADifferentName")
	go2ts.Add(reflect.TypeOf(SomeStruct{}))
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export interface ADifferentName {
	B: string;
}
`
	assert.Equal(t, expected, b.String())
}

func TestRender_AddMultiple_Success(t *testing.T) {
	type SomeStruct struct {
		B string
	}

	type AnotherStruct struct {
		A string
	}

	go2ts := New()
	go2ts.AddMultiple(SomeStruct{}, AnotherStruct{})
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export interface SomeStruct {
	B: string;
}

export interface AnotherStruct {
	A: string;
}
`
	assert.Equal(t, expected, b.String())
}

func TestRender_AddMultipleEmpty_Success(t *testing.T) {
	go2ts := New()
	go2ts.AddMultiple()
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.
`
	assert.Equal(t, expected, b.String())
}

func TestRender_AddMultipleUnion_Success(t *testing.T) {
	type DayOfWeek string

	const (
		Monday  DayOfWeek = "Mon"
		Tuesday DayOfWeek = "Tue"
	)
	daysOfWeek := []DayOfWeek{Monday, Tuesday}

	type MonthsOfYear string

	const (
		January  MonthsOfYear = "Jan"
		February MonthsOfYear = "Feb"
		March    MonthsOfYear = "Mar"
	)
	monthsOfYear := []MonthsOfYear{January, February, March}

	go2ts := New()
	go2ts.AddMultipleUnion(daysOfWeek, monthsOfYear)
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type DayOfWeek = 'Mon' | 'Tue';

export type MonthsOfYear = 'Jan' | 'Feb' | 'Mar';
`
	assert.Equal(t, expected, b.String())
}

func TestRender_AddMultipleUnionEmpty_Success(t *testing.T) {
	go2ts := New()
	go2ts.AddMultipleUnion()
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.
`
	assert.Equal(t, expected, b.String())
}

func TestRender_Add_NonStructType_Success(t *testing.T) {
	type Data map[string][]string

	go2ts := New()
	go2ts.Add(Data{})
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type Data = { [key: string]: string[] | null } | null;
`
	assert.Equal(t, expected, b.String())
}

func TestRender_AddIgnoreNil_NonStructType_Success(t *testing.T) {
	type Data map[string][]string

	go2ts := New()
	go2ts.AddIgnoreNil(Data{})
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type Data = { [key: string]: string[] };
`
	assert.Equal(t, expected, b.String())
}

func TestRender_AddIgnoreNil_NonStructType_GenerateNominalTypes_Success(t *testing.T) {
	type Data map[string][]string

	go2ts := New()
	go2ts.GenerateNominalTypes = true
	go2ts.AddIgnoreNil(Data{})
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type Data = { [key: string]: string[] } & {
	/**
	* WARNING: Do not reference this field from application code.
	*
	* This field exists solely to provide nominal typing. For reference, see
	* https://www.typescriptlang.org/play#example/nominal-typing.
	*/
	_dataBrand: 'type alias for { [key: string]: string[] }'
};

export function Data(v: { [key: string]: string[] }): Data {
	return v as Data;
};
`
	assert.Equal(t, expected, b.String())
}

func TestRender_AddWithName_NonStructType_Success(t *testing.T) {
	type Data map[string][]string

	go2ts := New()
	go2ts.AddWithName(Data{}, "SomeNewName")
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type SomeNewName = { [key: string]: string[] | null } | null;
`
	assert.Equal(t, expected, b.String())
}

func TestRender_AddWithNameIgnoreNil_NonStructType_Success(t *testing.T) {
	type Data map[string][]string

	go2ts := New()
	go2ts.AddWithNameIgnoreNil(Data{}, "SomeNewName")
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type SomeNewName = { [key: string]: string[] };
`
	assert.Equal(t, expected, b.String())
}

func TestRender_AddWithNameIgnoreNil_NonStructType_GenerateNominalTypes_Success(t *testing.T) {
	type Data map[string][]string

	go2ts := New()
	go2ts.GenerateNominalTypes = true
	go2ts.AddWithNameIgnoreNil(Data{}, "SomeNewName")
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type SomeNewName = { [key: string]: string[] } & {
	/**
	* WARNING: Do not reference this field from application code.
	*
	* This field exists solely to provide nominal typing. For reference, see
	* https://www.typescriptlang.org/play#example/nominal-typing.
	*/
	_someNewNameBrand: 'type alias for { [key: string]: string[] }'
};

export function SomeNewName(v: { [key: string]: string[] }): SomeNewName {
	return v as SomeNewName;
};
`
	assert.Equal(t, expected, b.String())
}

func TestAdd_UnsupportedType_Panic(t *testing.T) {
	type HasUnsupportedFieldTypes struct {
		C complex128
	}

	go2ts := New()
	assert.PanicsWithValue(t, `Go Kind "complex128" cannot be serialized to JSON.`, func() {
		go2ts.Add(HasUnsupportedFieldTypes{})
	})
}

func TestAddUnionWithName_SliceOfString_Success(t *testing.T) {
	type DayOfWeek string

	const (
		Monday  DayOfWeek = "Mon"
		Tuesday DayOfWeek = "Tue"
	)

	go2ts := New()
	go2ts.AddUnionWithName([]DayOfWeek{Monday, Tuesday}, "")
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type DayOfWeek = 'Mon' | 'Tue';
`
	assert.Equal(t, expected, b.String())
}

func TestAddUnion_SliceOfString_Success(t *testing.T) {
	type DayOfWeek string

	const (
		Monday  DayOfWeek = "Mon"
		Tuesday DayOfWeek = "Tue"
	)

	go2ts := New()
	go2ts.AddUnion([]DayOfWeek{Monday, Tuesday})
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type DayOfWeek = 'Mon' | 'Tue';
`
	assert.Equal(t, expected, b.String())
}

func TestAddUnionWithName_SliceOfStringWithName_Success(t *testing.T) {
	type DayOfWeek string

	const (
		Monday  DayOfWeek = "Mon"
		Tuesday DayOfWeek = "Tue"
	)

	go2ts := New()
	go2ts.AddUnionWithName([]DayOfWeek{Monday, Tuesday}, "ShouldBeTheTypeName")
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type ShouldBeTheTypeName = 'Mon' | 'Tue';
`
	assert.Equal(t, expected, b.String())
}

func TestAddUnionWithName_ArrayOfInt_Success(t *testing.T) {
	type SomeOption int

	const (
		OptionA SomeOption = 1
		OptionB SomeOption = 3
	)

	go2ts := New()
	go2ts.AddUnionWithName([2]SomeOption{OptionA, OptionB}, "")
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export type SomeOption = 1 | 3;
`
	assert.Equal(t, expected, b.String())
}

func TestAddUnionWithName_NotSliceOrArray_Panic(t *testing.T) {
	type SomeOption int

	go2ts := New()
	assert.PanicsWithValue(t, `AddUnionWithName must be supplied an array or slice, got int: 1`, func() {
		go2ts.AddUnionWithName(SomeOption(1), "")
	})
}

func TestAddUnion_DefinitionFoundFromStructAndUnion_UnionTypeDefinitionIsEmitted(t *testing.T) {
	type SomeOption int

	const (
		OptionA SomeOption = 1
		OptionB SomeOption = 3
	)

	type SomeStruct struct {
		Choices SomeOption
	}

	go2ts := New()
	go2ts.Add(SomeStruct{})
	go2ts.AddUnion([2]SomeOption{OptionA, OptionB})
	var b bytes.Buffer
	err := go2ts.Render(&b)
	require.NoError(t, err)
	expected := `// DO NOT EDIT. This file is automatically generated.

export interface SomeStruct {
	Choices: SomeOption;
}

export type SomeOption = 1 | 3;
`
	assert.Equal(t, expected, b.String())
}
