// Copyright 2016 The Chromium 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 templates

import (
	"text/template"
)

const fieldEncodingTmplText = `
{{- define "FieldEncodingTmpl" -}}
{{- $info := . -}}
{{- if and (not $info.IsUnion) $info.IsNullable -}}
if {{$info.Identifier}} == nil {
{{- if $info.IsPointer -}}
	encoder.WriteNullPointer()
{{- else if or $info.IsInterfaceRequest $info.IsHandle -}}
	encoder.WriteInvalidHandle()
{{- else if $info.IsInterface -}}
	encoder.WriteInvalidInterface()
{{- end -}}
} else {
	{{ template "NonNullableFieldEncodingTmpl" $info }}
}
{{- else -}}
{{ template "NonNullableFieldEncodingTmpl" $info }}
{{- end -}}
{{- end -}}
`

const nonNullableFieldEncodingTmplText = `
{{- define "NonNullableFieldEncodingTmpl" -}}
{{- $info := . -}}
{{- if $info.IsPointer -}}
if err := encoder.WritePointer(); err != nil {
	return err
}
{{end -}}
{{- if $info.IsSimple -}}
if err := encoder.{{$info.WriteFunction}}({{$info.Identifier}}); err != nil {
	return err
}
{{- else if $info.IsEnum -}}
if err := encoder.WriteInt32(int32({{$info.Identifier}})); err != nil {
	return err
}
{{- else if $info.IsHandle -}}
{{- if $info.IsNullable -}}
if err := encoder.WriteHandle(*({{$info.Identifier}})); err != nil {
{{- else -}}
if err := encoder.WriteHandle({{$info.Identifier}}); err != nil {
{{- end -}}
	return err
}
{{- else if $info.IsStruct -}}
if err := {{$info.Identifier}}.Encode(encoder); err != nil {
	return err
}
{{- else if $info.IsUnion -}}
{{- if $info.IsPointer -}}
encoder.StartNestedUnion()
{{end -}}
if {{$info.Identifier}} == nil {
{{- if $info.IsNullable -}}
	encoder.WriteNullUnion()
{{- else -}}
	return &bindings.ValidationError{bindings.UnexpectedNullUnion, "unexpected null union"}
{{- end -}}
} else {
	if err := {{$info.Identifier}}.Encode(encoder); err != nil {
		return err
	}
}
{{- else if $info.IsInterface -}}
if err := encoder.{{$info.WriteFunction}}({{$info.Identifier}}.PassMessagePipe()); err != nil {
	return err
}
{{- else if $info.IsArray -}}
{{ $elInfo := $info.ElementEncodingInfo -}}
encoder.StartArray(uint32(len({{$info.Identifier}})), {{$elInfo.BitSize}})
for _, {{$elInfo.Identifier}} := range {{$info.Identifier}} {
	{{ template "FieldEncodingTmpl" $elInfo }}
}
if err := encoder.Finish(); err != nil {
	return err
}
{{- else if $info.IsMap -}}
{{ $keyInfo := $info.KeyEncodingInfo -}}
{{ $keyElId := $info.KeyEncodingInfo.ElementEncodingInfo.Identifier -}}
{{ $valueInfo := $info.ValueEncodingInfo -}}
{{ $valueElId := $info.ValueEncodingInfo.ElementEncodingInfo.Identifier -}}
encoder.StartMap()
{
	var {{$keyInfo.Identifier}} {{$keyInfo.GoType}}
	var {{$valueInfo.Identifier}} {{$valueInfo.GoType}}
	for {{$keyElId}} := range {{$info.Identifier}} {
		{{$keyInfo.Identifier}} = append({{$keyInfo.Identifier}}, {{$keyElId}})
	}
	if encoder.Deterministic() {
		bindings.SortMapKeys(&{{$keyInfo.Identifier}})
	}
	for {{$keyElId}} := range {{$keyInfo.Identifier}} {
		{{$valueInfo.Identifier}} = append({{$valueInfo.Identifier}}, {{$info.Identifier}}[{{$keyElId}}])
	}
	{{ template "FieldEncodingTmpl" $keyInfo }}
	{{ template "FieldEncodingTmpl" $valueInfo }}
}
if err := encoder.Finish(); err != nil {
	return err
}
{{- end -}}
{{- end -}}
`

func initEncodingTemplates() {
	template.Must(goFileTmpl.Parse(nonNullableFieldEncodingTmplText))
	template.Must(goFileTmpl.Parse(fieldEncodingTmplText))
}
