{{ define "serverheaderbuilder" }}
{{ if not .IsArray }}{{ template "simpleserverheaderbuilder" . }}{{ else }}{{ template "sliceserverheaderbuilder" . }}{{ end }}
{{- end }}
{{ define "simpleserverheaderbuilder" }}
{{ if .IsNullable -}}
var {{ varname .ID }} string
if {{ .ReceiverName }}.{{ pascalize .ID }} != nil {
  {{ varname .ID }} = {{ if .Formatter }}{{ .Formatter }}(*{{ .ReceiverName }}.{{ pascalize .ID }}){{ else }}{{ if not .IsCustomFormatter }}*{{ end }}{{ .ReceiverName }}.{{ pascalize .ID }}{{ if .IsCustomFormatter }}.String(){{end}}{{end}}
}
{{ else }}{{ varname .ID }} := {{ if .Formatter }}{{ .Formatter }}({{ .ReceiverName }}.{{ pascalize .ID }}){{ else }}{{ .ReceiverName }}.{{ pascalize .ID }}{{ if .IsCustomFormatter }}.String(){{end}}{{end}}
{{ end -}}
if {{ varname .ID }} != "" {
  rw.Header().Set({{ printf "%q" .Name }}, {{ varname .ID }})
}
{{ end }}
{{ define "sliceitemserverheaderbuilder" }}
{{ if .IsNullable -}}
var {{ .ValueExpression }}S string
if {{ .ValueExpression }} != nil {
  {{ .ValueExpression }}S = {{ if .Formatter }}{{ .Formatter }}(*{{ .ValueExpression }}){{ else }}*{{ .ValueExpression }}{{ if .IsCustomFormatter }}.String(){{end}}{{end}}
}
{{ else -}}
{{ .ValueExpression }}S := {{ if .Formatter }}{{ .Formatter }}({{ .ValueExpression }}){{ else }}{{ .ValueExpression }}{{ if .IsCustomFormatter }}.String(){{end}}{{end}}
{{ end -}}
if {{ .ValueExpression }}S != "" {
  {{ .ValueExpression }}R = append({{ .ValueExpression }}R, {{ .ValueExpression }}S)
}
{{ end }}
{{define "sliceserverheaderbuilder" }}
var {{ varname .Child.ValueExpression }}R []string
for _, {{ varname .Child.ValueExpression }} := range {{ .ValueExpression }} {
  {{- if not .Child.IsArray }}{{ template "sliceitemserverheaderbuilder" .Child }}{{ else }}{{ template "sliceserverheaderbuilder" .Child }}{{ end -}}
}
{{ if not .Child.Parent -}}
{{ varname .ID }} := swag.JoinByFormat({{ varname .Child.ValueExpression }}R, {{ printf "%q" .CollectionFormat }})
if len({{ varname .ID }}) > 0 {
  hv := {{ varname .ID }}[0]
  if hv != "" {
    rw.Header().Set({{ printf "%q" .Name }}, hv)
  }
}
{{ else -}}
{{ .ValueExpression }}S := swag.JoinByFormat({{ varname .Child.ValueExpression }}R, {{ printf "%q" .CollectionFormat }})
if len({{ .ValueExpression }}S) > 0 {
  {{ .ValueExpression }}Ss := {{ .ValueExpression }}S[0]
  if {{ .ValueExpression }}Ss != "" {
    {{ .ValueExpression }}R = append({{ .ValueExpression }}R, {{ .ValueExpression }}Ss)
  }
}
{{ end -}}
{{ end -}}
{{ define "serverresponse" }}
{{ if ne .Code -1 }}// {{pascalize .Name}}Code is the HTTP code returned for type {{ pascalize .Name}}
const {{ pascalize .Name}}Code int = {{ .Code }}{{ end }}

/*{{ if .Description }}{{ pascalize .Name }} {{ blockcomment .Description }}{{else}}{{ pascalize .Name }} {{ humanize .Name }}{{end}}

swagger:response {{ camelize .Name }}
*/
type {{ pascalize .Name }} struct {
  {{ if eq .Code -1 }}
  _statusCode int
  {{ end }}{{ range .Headers }}/*{{if .Description }}{{ blockcomment .Description }}{{ end }}
  {{ if .Maximum }}
  Maximum: {{ if .ExclusiveMaximum }}< {{ end }}{{ .Maximum }}{{ end }}{{ if .Minimum }}
  Minimum: {{ if .ExclusiveMinimum }}> {{ end }}{{ .Minimum }}{{ end }}{{ if .MultipleOf }}
  Multiple Of: {{ .MultipleOf }}{{ end }}{{ if .MaxLength }}
  Max Length: {{ .MaxLength }}{{ end }}{{ if .MinLength }}
  Min Length: {{ .MinLength }}{{ end }}{{ if .Pattern }}
  Pattern: {{ .Pattern }}{{ end }}{{ if .MaxItems }}
  Max Items: {{ .MaxItems }}{{ end }}{{ if .MinItems }}
  Min Items: {{ .MinItems }}{{ end }}{{ if .UniqueItems }}
  Unique: true{{ end }}{{ if .HasDefault }}
  Default: {{ printf "%#v" .Default }}{{ end }}
  */
  {{ pascalize .Name }} {{ .GoType }} `json:"{{.Name}}{{ if not .Required }},omitempty{{ end }}{{ if .IsJSONString }},string{{ end }}"`
  {{ end }}
  {{ if .Schema }}{{ with .Schema }}
  /*{{if .Description }}{{ blockcomment .Description }}{{ end }}{{ if .Maximum }}
  Maximum: {{ if .ExclusiveMaximum }}< {{ end }}{{ .Maximum }}{{ end }}{{ if .Minimum }}
  Minimum: {{ if .ExclusiveMinimum }}> {{ end }}{{ .Minimum }}{{ end }}{{ if .MultipleOf }}
  Multiple Of: {{ .MultipleOf }}{{ end }}{{ if .MaxLength }}
  Max Length: {{ .MaxLength }}{{ end }}{{ if .MinLength }}
  Min Length: {{ .MinLength }}{{ end }}{{ if .Pattern }}
  Pattern: {{ .Pattern }}{{ end }}{{ if .MaxItems }}
  Max Items: {{ .MaxItems }}{{ end }}{{ if .MinItems }}
  Min Items: {{ .MinItems }}{{ end }}{{ if .UniqueItems }}
  Unique: true{{ end }}
  In: Body
  */{{ end }}
  Payload {{ if and (not .Schema.IsBaseType) .Schema.IsComplexObject }}*{{ end }}{{ .Schema.GoType }} `json:"body,omitempty"`
  {{ end }}
}

// New{{ pascalize .Name }} creates {{ pascalize .Name }} with default headers values
func New{{ pascalize .Name }}({{ if eq .Code -1 }}code int{{ end }}) *{{ pascalize .Name }} { {{ if eq .Code -1 }}
if code <= 0 {
    code = 500
  }
{{ end }}
{{ if .Headers.HasSomeDefaults }}
  var (
  // initialize headers with default values
  {{ range .Headers }}
      {{ if .HasDefault -}}
          {{ varname .ID}}Default =
              {{- if and .IsPrimitive .IsCustomFormatter (not (stringContains .Zero "(\"" )) }}{{ .Zero }}{{/* strfmt type initializer requires UnmarshalText(), e.g. Date, Datetime, Duration */}}
              {{- else if and .IsPrimitive .IsCustomFormatter (stringContains .Zero "(\"" ) }}{{.GoType}}({{- printf "%#v" .Default }}){{/* strfmt type initializer takes string */}}
              {{- else if and .IsPrimitive (not .IsCustomFormatter) -}}{{.GoType}}({{- printf "%#v" .Default }}){{/* regular go primitive type initializer */}}
              {{- else if .IsArray -}}{{- /* Do not initialize from possible defaults in nested arrays */ -}}
                  {{- if and .Child.IsPrimitive .Child.IsCustomFormatter }}{{ .Zero }}{{/* initialization strategy with UnmarshalText() */}}
                  {{- else if .Child.IsArray -}}{{ .Zero }}{{/* initialization strategy with json.Unmarshal() */}}
                  {{- else if and .Child.IsPrimitive (not .Child.IsCustomFormatter) -}}{{.GoType}}{{- arrayInitializer .Default }}{{/* regular go primitive type initializer: simple slice initializer */}}
                  {{- else }}{{ printf "%#v" .Default }}{{/* all other cases (e.g. schema) [should not occur] */}}
                  {{- end }}
              {{- else }}{{ printf "%#v" .Default }}{{/* case .Schema */}}
              {{- end }}
      {{- end }}
  {{- end }}
  )

{{ range .Headers }}{{ if .HasDefault -}}{{- /* carry on UnmarshalText initialization strategy */ -}}
      {{ if and .IsPrimitive .IsCustomFormatter (not (stringContains .Zero "(\"")) }}{{ varname .ID}}Default.UnmarshalText([]byte({{ printf "%q" .Default }}))
      {{ else if .IsArray -}}
          {{ if or ( and .Child.IsPrimitive .Child.IsCustomFormatter ) .Child.IsArray -}}
          if err := json.Unmarshal([]byte(`{{printf "%s" (json .Default)}}`), &{{ varname .ID }}Default); err != nil {
            // panics if specification is invalid
            msg := fmt.Sprintf("invalid default value for header {{ varname .ID }}: %v",err)
            panic(msg)
          }
          {{ end -}}
      {{- end }}
  {{- end }}
{{- end }}
{{ end }}
  return &{{ pascalize .Name }}{
    {{ if eq .Code -1 }}_statusCode: code,{{ end }}
    {{ range .Headers }}{{ if .HasDefault }}
    {{ pascalize .Name}}: {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}&{{ end }}{{ varname .ID }}Default,
    {{ end }}
  {{ end -}}
  }
}

{{ if eq .Code -1 }}
// WithStatusCode adds the status to the {{ humanize .Name }} response
func ({{ .ReceiverName }} *{{ pascalize .Name }}) WithStatusCode(code int) *{{ pascalize .Name }} {
  {{ .ReceiverName }}._statusCode = code
  return {{ .ReceiverName }}
}

// SetStatusCode sets the status to the {{ humanize .Name }} response
func ({{ .ReceiverName }} *{{ pascalize .Name }}) SetStatusCode(code int) {
  {{ .ReceiverName }}._statusCode = code
}
{{ end }}{{ range .Headers }}
// With{{ pascalize .Name }} adds the {{ camelize .Name  }} to the {{ humanize $.Name }} response
func ({{ $.ReceiverName }} *{{ pascalize $.Name }}) With{{ pascalize .Name }}({{ varname .Name  }} {{ .GoType}}) *{{ pascalize $.Name }} {
  {{ $.ReceiverName }}.{{ pascalize .Name }} = {{ varname .Name  }}
  return {{ .ReceiverName }}
}

// Set{{ pascalize .Name }} sets the {{ camelize .Name  }} to the {{ humanize $.Name }} response
func ({{ $.ReceiverName }} *{{ pascalize $.Name }}) Set{{ pascalize .Name }}({{ varname .Name  }} {{ .GoType}}) {
  {{ $.ReceiverName }}.{{ pascalize .Name }} = {{ varname .Name  }}
}
{{ end }}{{ if .Schema }}
// WithPayload adds the payload to the {{ humanize .Name }} response
func ({{ .ReceiverName }} *{{ pascalize .Name }}) WithPayload(payload {{ if and .Schema.IsComplexObject (not .Schema.IsBaseType) }}*{{ end }}{{ .Schema.GoType }}) *{{ pascalize .Name }} {
  {{ .ReceiverName }}.Payload = payload
  return {{ .ReceiverName }}
}

// SetPayload sets the payload to the {{ humanize .Name }} response
func ({{ .ReceiverName }} *{{ pascalize .Name }}) SetPayload(payload {{ if and .Schema.IsComplexObject (not .Schema.IsBaseType) }}*{{ end }}{{ .Schema.GoType }}) {
  {{ .ReceiverName }}.Payload = payload
}
{{ end }}

// WriteResponse to the client
func ({{ .ReceiverName }} *{{ pascalize .Name }}) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {
  {{ range .Headers }}
  // response header {{.Name}}
    {{ template "serverheaderbuilder" . -}}
  {{ end }}
  {{ if not .Schema }}
  rw.Header().Del(runtime.HeaderContentType) // Remove Content-Type on empty responses
  {{ end }}
  rw.WriteHeader({{ if eq .Code -1 }}{{ .ReceiverName }}._statusCode{{ else }}{{ .Code }}{{ end }})
  {{- if .Schema }}
    {{- if .Schema.IsComplexObject }}
  if {{ .ReceiverName }}.Payload != nil {
    {{- end }}
    payload := {{ .ReceiverName }}.Payload
    {{- if and (not .Schema.IsInterface) (or .Schema.IsArray .Schema.IsMap) }}
    if payload == nil {
      // return empty {{ if .Schema.IsArray }}array{{ else if .Schema.IsMap }}map{{ end }}
      payload =
      {{- if or .Schema.IsAliased .Schema.IsComplexObject }}
        {{- if and (not .Schema.IsBaseType) .Schema.IsComplexObject }}&{{ end  }}{{ .Schema.GoType -}} {}
      {{- else }}
        {{- .Schema.Zero }}
      {{- end }}
    }
    {{ end }}
    if err := producer.Produce(rw, payload); err != nil {
      panic(err) // let the recovery middleware deal with this
    }
    {{- if .Schema.IsComplexObject }}
  }
    {{- end }}
  {{- end }}
}

{{ if $.StrictResponders }}
func ({{ .ReceiverName }} *{{ pascalize .Name }}) {{ pascalize .OperationName }}Responder() {}
{{- end }}
{{ end }}// Code generated by go-swagger; DO NOT EDIT.


{{ if .Copyright -}}// {{ comment .Copyright -}}{{ end }}


package {{ .Package }}

// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command


import (
  "fmt"
  "net/http"

  "github.com/go-openapi/errors"
  "github.com/go-openapi/runtime"
  "github.com/go-openapi/runtime/security"
  "github.com/go-openapi/swag"
  "github.com/go-openapi/validate"
  "github.com/go-openapi/runtime/middleware"

  {{ imports .DefaultImports }}
  {{ imports .Imports }}
)

{{ range .Responses }}
{{ template "serverresponse" . }}
{{ end }}
{{ if .DefaultResponse }}
{{ template "serverresponse" .DefaultResponse }}
{{ end }}

{{ if $.StrictResponders }}
type {{ pascalize .Name }}NotImplementedResponder struct {
  middleware.Responder
}

func (*{{ pascalize .Name }}NotImplementedResponder) {{ pascalize .Name }}Responder() {}

func {{ pascalize .Name }}NotImplemented() {{ pascalize .Name }}Responder {
  return &{{ pascalize .Name }}NotImplementedResponder{
    middleware.NotImplemented(
      "operation authentication.{{ pascalize .Name }} has not yet been implemented",
      ),
  }
}

type {{ pascalize .Name }}Responder interface {
  middleware.Responder
  {{ pascalize .Name }}Responder()
}
{{ end }}
