{{>licenseInfo}}
package {{package}};

{{#imports}}import {{import}};
{{/imports}}
import io.swagger.annotations.*;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;

{{#models}}

{{#model}}
{{#description}}
/**
 * {{description}}
 **/
{{/description}}

@ApiModel(description = "{{{description}}}")
{{#isEnum}}
  public enum {{classname}} {
{{#vendorExtensions.x-has-enum-pairs}}
{{#vendorExtensions.x-enum-pairs}}
    {{Name}}({{Value}}){{#IsLast}};{{/IsLast}}{{^IsLast}},{{/IsLast}}
{{/vendorExtensions.x-enum-pairs}}

    private int value;
    {{classname}}(int val){
        this.value = val;
    }
    public int getValue(){
        return value;
    }
{{/vendorExtensions.x-has-enum-pairs}}
{{^vendorExtensions.x-has-enum-pairs}}
    // Failed to generate enum with integer
    {{#allowableValues}}{{#values}} {{.}}, {{/values}}{{/allowableValues}}
{{/vendorExtensions.x-has-enum-pairs}}
  }
{{/isEnum}}
{{^isEnum}}
public class {{classname}} {{#vendorExtensions.x-inheritsName}} extends {{vendorExtensions.x-inheritsName}} {{/vendorExtensions.x-inheritsName}}{{#serializableModel}}implements Serializable {{/serializableModel}}{
  {{#vars}}
{{#isEnum}}
  // mv: {{{model.vendorExtensions}}}
  // v: {{{vendorExtensions}}}
  {{^vendorExtensions.x-isinherited}}
  /* 修改Swagger android的mustache模版，删除nested enum: {{datatypeWithEnum}}，改用全局的enum */
  {{^vendorExtensions.x-isinherited}}
  @SerializedName("{{baseName}}") //mark 1
  {{#model.vendorExtensions.x-polymorphicBase}}
  protected {{{vendorExtensions.x-enumTypeName}}} {{name}} = {{{defaultValue}}}; //mark 11
  {{/model.vendorExtensions.x-polymorphicBase}}
  {{^model.vendorExtensions.x-polymorphicBase}}
  private {{{vendorExtensions.x-enumTypeName}}} {{name}} = {{{defaultValue}}}; //mark 12
  {{/model.vendorExtensions.x-polymorphicBase}}
  {{/vendorExtensions.x-isinherited}}
  {{/vendorExtensions.x-isinherited}}
{{/isEnum}}
{{^isEnum}}
  // mv2: {{{model.vendorExtensions}}}
  // vv2: {{{vendorExtensions}}}
  {{^vendorExtensions.x-isinherited}}
  {{#model.vendorExtensions.x-polymorphicBase}}
  @SerializedName("{{baseName}}") //mark 2.1
  protected {{{datatype}}} {{name}} = {{{defaultValue}}}; //mark 21
  {{/model.vendorExtensions.x-polymorphicBase}}
  {{^model.vendorExtensions.x-polymorphicBase}}
  {{^vendorExtensions.x-isinherited}}
  @SerializedName("{{baseName}}") //mark 2.2
  private {{{datatype}}} {{name}} = {{{defaultValue}}}; //mark 22
  {{/vendorExtensions.x-isinherited}}
  {{/model.vendorExtensions.x-polymorphicBase}}
  {{/vendorExtensions.x-isinherited}}
{{/isEnum}}
{{/vars}}

  {{#vars}}
  {{^vendorExtensions.x-isinherited}}
  /**{{#description}} 
   * {{{description}}}{{/description}}{{#minimum}}
   * minimum: {{minimum}}{{/minimum}}{{#maximum}}
   * maximum: {{maximum}}{{/maximum}}
   **/
  // mv3: {{{model.vendorExtensions}}}
  // v3: {{{vendorExtensions}}}
  {{#vendorExtensions.x-enumTypeName}}
  public {{{vendorExtensions.x-enumTypeName}}} {{getter}}() { //mark 31
  {{/vendorExtensions.x-enumTypeName}}
  {{^vendorExtensions.x-enumTypeName}}
  @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}")
  public {{{datatype}}} {{getter}}() { //mark 32
  {{/vendorExtensions.x-enumTypeName}}
    return {{name}};
  }
  {{#vendorExtensions.x-enumTypeName}}
  public void {{setter}}({{{vendorExtensions.x-enumTypeName}}} {{name}}) { //mark 41
  {{/vendorExtensions.x-enumTypeName}}
  {{^vendorExtensions.x-enumTypeName}}
  public void {{setter}}({{{datatype}}} {{name}}) { //mark 42
  {{/vendorExtensions.x-enumTypeName}}
    this.{{name}} = {{name}};
  }
  {{/vendorExtensions.x-isinherited}}

  {{/vars}}

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}}
    return {{#vars}}(this.{{name}} == null ? {{classVarName}}.{{name}} == null : this.{{name}}.equals({{classVarName}}.{{name}})){{#hasMore}} &&
        {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}}
    return true;{{/hasVars}}
  }

  @Override
  public int hashCode() {
    int result = 17;
    {{#vars}}
    result = 31 * result + (this.{{name}} == null ? 0: this.{{name}}.hashCode());
    {{/vars}}
    return result;
  }

  @Override
  public String toString()  {
    StringBuilder sb = new StringBuilder();
    sb.append("class {{classname}} {\n");
    {{#parent}}sb.append("  " + super.toString()).append("\n");{{/parent}}
    {{#vars}}sb.append("  {{name}}: ").append({{name}}).append("\n");
    {{/vars}}sb.append("}\n");
    return sb.toString();
  }
}
{{/isEnum}}
{{/model}}
{{/models}}
