/*
* Copyright 2014 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

// independent from idl_parser, since this code is not needed for most clients

#include <string>

#include "flatbuffers/flatbuffers.h"
#include "flatbuffers/idl.h"
#include "flatbuffers/util.h"
#include "flatbuffers/code_generators.h"

namespace flatbuffers {
namespace php {
    // Hardcode spaces per indentation.
    const std::string Indent = "    ";
    class PhpGenerator : public BaseGenerator {
     public:
      PhpGenerator(const Parser &parser, const std::string &path,
                   const std::string &file_name)
          : BaseGenerator(parser, path, file_name, "\\", "\\"){};
      bool generate() {
        if (!generateEnums()) return false;
        if (!generateStructs()) return false;
        return true;
      }

     private:
      bool generateEnums() {
        for (auto it = parser_.enums_.vec.begin();
             it != parser_.enums_.vec.end(); ++it) {
          auto &enum_def = **it;
          std::string enumcode;
          GenEnum(enum_def, &enumcode);
          if (!SaveType(enum_def, enumcode, false)) return false;
        }
        return true;
      }

      bool generateStructs() {
        for (auto it = parser_.structs_.vec.begin();
             it != parser_.structs_.vec.end(); ++it) {
          auto &struct_def = **it;
          std::string declcode;
          GenStruct(struct_def, &declcode);
          if (!SaveType(struct_def, declcode, true)) return false;
        }
        return true;
      }

      // Begin by declaring namespace and imports.
      void BeginFile(const std::string name_space_name,
                     const bool needs_imports, std::string *code_ptr) {
        std::string &code = *code_ptr;
        code += "<?php\n";
        code = code + "// " + FlatBuffersGeneratedWarning();
        code += "namespace " + name_space_name + ";\n\n";

        if (needs_imports) {
          code += "use \\Google\\FlatBuffers\\Struct;\n";
          code += "use \\Google\\FlatBuffers\\Table;\n";
          code += "use \\Google\\FlatBuffers\\ByteBuffer;\n";
          code += "use \\Google\\FlatBuffers\\FlatBufferBuilder;\n";
          code += "\n";
        }
      }

      // Save out the generated code for a Php Table type.
      bool SaveType(const Definition &def, const std::string &classcode,
                    bool needs_imports) {
        if (!classcode.length()) return true;

        std::string code = "";
        BeginFile(FullNamespace("\\", *def.defined_namespace),
                  needs_imports, &code);
        code += classcode;

        std::string filename = NamespaceDir(*def.defined_namespace) +
                               def.name + ".php";
        return SaveFile(filename.c_str(), code, false);
      }

    // Begin a class declaration.
    static void BeginClass(const StructDef &struct_def, std::string *code_ptr) {
      std::string &code = *code_ptr;
      if (struct_def.fixed) {
        code += "class " + struct_def.name + " extends Struct\n";
      } else {
        code += "class " + struct_def.name + " extends Table\n";
      }
      code += "{\n";
    }

    static void EndClass(std::string *code_ptr) {
      std::string &code = *code_ptr;
      code += "}\n";
    }

    // Begin enum code with a class declaration.
    static void BeginEnum(const std::string class_name, std::string *code_ptr) {
      std::string &code = *code_ptr;
      code += "class " + class_name + "\n{\n";
    }

    // A single enum member.
    static void EnumMember(const EnumVal ev, std::string *code_ptr) {
      std::string &code = *code_ptr;
      code += Indent + "const ";
      code += ev.name;
      code += " = ";
      code += NumToString(ev.value) + ";\n";
    }

    // End enum code.
    static void EndEnum(std::string *code_ptr) {
      std::string &code = *code_ptr;
      code += "}\n";
    }

    // Initialize a new struct or table from existing data.
    static void NewRootTypeFromBuffer(const StructDef &struct_def,
      std::string *code_ptr) {
      std::string &code = *code_ptr;

      code += Indent + "/**\n";
      code += Indent + " * @param ByteBuffer $bb\n";
      code += Indent + " * @return " + struct_def.name + "\n";
      code += Indent + " */\n";
      code += Indent + "public static function getRootAs";
      code += struct_def.name;
      code += "(ByteBuffer $bb)\n";
      code += Indent + "{\n";

      code += Indent + Indent + "$obj = new " + struct_def.name + "();\n";
      code += Indent + Indent;
      code += "return ($obj->init($bb->getInt($bb->getPosition())";
      code += " + $bb->getPosition(), $bb));\n";
      code += Indent + "}\n\n";
    }

    // Initialize an existing object with other data, to avoid an allocation.
    static void InitializeExisting(const StructDef &struct_def,
      std::string *code_ptr) {
      std::string &code = *code_ptr;

      code += Indent + "/**\n";
      code += Indent + " * @param int $_i offset\n";
      code += Indent + " * @param ByteBuffer $_bb\n";
      code += Indent + " * @return " + struct_def.name + "\n";
      code += Indent + " **/\n";
      code += Indent + "public function init($_i, ByteBuffer $_bb)\n";
      code += Indent + "{\n";
      code += Indent + Indent + "$this->bb_pos = $_i;\n";
      code += Indent + Indent + "$this->bb = $_bb;\n";
      code += Indent + Indent + "return $this;\n";
      code += Indent + "}\n\n";
    }

    // Get the length of a vector.
    static void GetVectorLen(const FieldDef &field,
      std::string *code_ptr) {
      std::string &code = *code_ptr;

      code += Indent + "/**\n";
      code += Indent + " * @return int\n";
      code += Indent + " */\n";
      code += Indent + "public function get";
      code += MakeCamel(field.name) + "Length()\n";
      code += Indent + "{\n";
      code += Indent + Indent + "$o = $this->__offset(";
      code += NumToString(field.value.offset) + ");\n";
      code += Indent + Indent;
      code += "return $o != 0 ? $this->__vector_len($o) : 0;\n";
      code += Indent + "}\n\n";
    }

    // Get a [ubyte] vector as a byte array.
    static void GetUByte(const FieldDef &field,
      std::string *code_ptr) {
      std::string &code = *code_ptr;

      code += Indent + "/**\n";
      code += Indent + " * @return string\n";
      code += Indent + " */\n";
      code += Indent + "public function get";
      code += MakeCamel(field.name) + "Bytes()\n";
      code += Indent + "{\n";
      code += Indent + Indent + "return $this->__vector_as_bytes(";
      code += NumToString(field.value.offset) + ");\n";
      code += Indent + "}\n\n";
    }

    // Get the value of a struct's scalar.
    static void GetScalarFieldOfStruct(const FieldDef &field,
      std::string *code_ptr) {
      std::string &code = *code_ptr;
      std::string getter = GenGetter(field.value.type);

      code += Indent + "/**\n";
      code += Indent + " * @return ";
      code += GenTypeGet(field.value.type) + "\n";
      code += Indent + " */\n";
      code += Indent + "public function " + getter;
      code += MakeCamel(field.name) + "()\n";
      code += Indent + "{\n";
      code += Indent + Indent + "return ";

      code += "$this->bb->get";
      code += MakeCamel(GenTypeGet(field.value.type));
      code += "($this->bb_pos + ";
      code += NumToString(field.value.offset) + ")";
      code += ";\n";

      code += Indent + "}\n\n";
    }

    // Get the value of a table's scalar.
    void GetScalarFieldOfTable(const FieldDef &field, std::string *code_ptr) {
      std::string &code = *code_ptr;
      std::string getter = GenGetter(field.value.type);

      code += Indent + "/**\n";
      code += Indent + " * @return " + GenTypeGet(field.value.type) + "\n";
      code += Indent + " */\n";
      code += Indent + "public function get";
      code += MakeCamel(field.name);
      code += "()\n";
      code += Indent + "{\n";
      code += Indent + Indent +
        "$o = $this->__offset(" +
        NumToString(field.value.offset) +
        ");\n" + Indent + Indent + "return $o != 0 ? ";
      code += "$this->bb->get";
      code += MakeCamel(GenTypeGet(field.value.type)) + "($o + $this->bb_pos)";
      code += " : " + GenDefaultValue(field.value) + ";\n";
      code += Indent + "}\n\n";
    }

    // Get a struct by initializing an existing struct.
    // Specific to Struct.
    void GetStructFieldOfStruct(const FieldDef &field, std::string *code_ptr) {
      std::string &code = *code_ptr;

      code += Indent + "/**\n";
      code += Indent + " * @return " + GenTypeGet(field.value.type) + "\n";
      code += Indent + " */\n";
      code += Indent + "public function get";
      code += MakeCamel(field.name) + "()\n";
      code += Indent + "{\n";
      code += Indent + Indent + "$obj = new ";
      code += GenTypeGet(field.value.type) + "();\n";
      code += Indent + Indent + "$obj->init($this->bb_pos + ";
      code += NumToString(field.value.offset) + ", $this->bb);";
      code += "\n" + Indent + Indent + "return $obj;\n";
      code += Indent + "}\n\n";
    }

    // Get a struct by initializing an existing struct.
    // Specific to Table.
    void GetStructFieldOfTable(const FieldDef &field, std::string *code_ptr) {
      std::string &code = *code_ptr;

      code += Indent + "public function get";
      code += MakeCamel(field.name);
      code += "()\n";
      code += Indent + "{\n";
      code += Indent + Indent + "$obj = new ";
      code += MakeCamel(GenTypeGet(field.value.type)) + "();\n";
      code += Indent + Indent +
        "$o = $this->__offset(" +
        NumToString(field.value.offset) +
        ");\n";
      code += Indent + Indent;
      code += "return $o != 0 ? $obj->init(";
      if (field.value.type.struct_def->fixed)
      {
        code += "$o + $this->bb_pos, $this->bb) : ";
      } else {
        code += "$this->__indirect($o + $this->bb_pos), $this->bb) : ";
      }
      code += GenDefaultValue(field.value) + ";\n";
      code += Indent + "}\n\n";
    }

    // Get the value of a string.
    void GetStringField(const FieldDef &field, std::string *code_ptr) {
      std::string &code = *code_ptr;
      code += Indent + "public function get";
      code += MakeCamel(field.name);
      code += "()\n";
      code += Indent + "{\n";
      code += Indent + Indent +
        "$o = $this->__offset(" +
        NumToString(field.value.offset) +
        ");\n";
      code += Indent + Indent;
      code += "return $o != 0 ? $this->__string($o + $this->bb_pos) : ";
      code += GenDefaultValue(field.value) + ";\n";
      code += Indent + "}\n\n";
    }

    // Get the value of a union from an object.
    void GetUnionField(const FieldDef &field, std::string *code_ptr) {
      std::string &code = *code_ptr;

      code += Indent + "/**\n";
      code += Indent + " * @return" + GenTypeBasic(field.value.type) + "\n";
      code += Indent + " */\n";
      code += Indent + "public function get";
      code += MakeCamel(field.name) + "($obj)\n";
      code += Indent + "{\n";
      code += Indent + Indent +
        "$o = $this->__offset(" +
        NumToString(field.value.offset) +
        ");\n";
      code += Indent + Indent;
      code += "return $o != 0 ? $this->__union($obj, $o) : null;\n";
      code += Indent + "}\n\n";
    }

    // Get the value of a vector's struct member.
    void GetMemberOfVectorOfStruct(const StructDef &struct_def,
      const FieldDef &field, std::string *code_ptr) {
      std::string &code = *code_ptr;
      auto vectortype = field.value.type.VectorType();

      code += Indent + "/**\n";
      code += Indent + " * @return" + GenTypeBasic(field.value.type) + "\n";
      code += Indent + " */\n";
      code += Indent + "public function get";
      code += MakeCamel(field.name);
      code += "($j)\n";
      code += Indent + "{\n";
      code += Indent + Indent +
        "$o = $this->__offset(" +
        NumToString(field.value.offset) +
        ");\n";
      code += Indent + Indent + "$obj = new ";
      code += MakeCamel(GenTypeGet(field.value.type)) + "();\n";

      switch (field.value.type.base_type) {
      case BASE_TYPE_STRUCT:
        if (struct_def.fixed) {
          code += Indent + Indent;
          code += "return $o != 0 ? $obj->init($this->bb_pos +"
            + NumToString(field.value.offset) + ", $this->bb) : null;\n";
        } else {
          code += Indent + Indent + "return $o != 0 ? $obj->init(";
          code += field.value.type.struct_def->fixed
            ? "$o + $this->bb_pos"
            : "$this->__indirect($o + $this->bb_pos)";
          code += ", $this->bb) : null;\n";
        }
        break;
      case BASE_TYPE_STRING:
        code += "// base_type_string\n";
        // TODO(chobie): do we need this?
        break;
      case BASE_TYPE_VECTOR:
        if (vectortype.base_type == BASE_TYPE_STRUCT) {
          code += Indent + Indent + "return $o != 0 ? $obj->init(";
          if (vectortype.struct_def->fixed) {
            code += "$this->__vector($o) + $j *";
            code += NumToString(InlineSize(vectortype));
          } else {
            code += "$this->__indirect($this->__vector($o) + $j * ";
            code += NumToString(InlineSize(vectortype)) + ")";
          }
          code += ", $this->bb) : null;\n";
        }
        break;
      case BASE_TYPE_UNION:
        code += Indent + Indent + "return $o != 0 ? $this->";
        code += GenGetter(field.value.type) + "($obj, $o); null;\n";
        break;
      default:
        break;
      }

      code += Indent + "}\n\n";
    }

    // Get the value of a vector's non-struct member. Uses a named return
    // argument to conveniently set the zero value for the result.
    void GetMemberOfVectorOfNonStruct(const FieldDef &field,
      std::string *code_ptr) {
      std::string &code = *code_ptr;
      auto vectortype = field.value.type.VectorType();

      code += Indent + "/**\n";
      code += Indent + " * @param int offset\n";
      code += Indent + " * @return " + GenTypeGet(field.value.type) + "\n";
      code += Indent + " */\n";
      code += Indent + "public function get";
      code += MakeCamel(field.name);
      code += "($j)\n";
      code += Indent + "{\n";
      code += Indent + Indent +
        "$o = $this->__offset(" +
        NumToString(field.value.offset) +
        ");\n";

      if (field.value.type.VectorType().base_type == BASE_TYPE_STRING) {
        code += Indent + Indent;
        code += "return $o != 0 ? $this->__string($this->__vector($o) + $j * ";
        code += NumToString(InlineSize(vectortype)) + ") : ";
        code += GenDefaultValue(field.value) + ";\n";
      } else {
        code += Indent + Indent + "return $o != 0 ? $this->bb->get";
        code += MakeCamel(GenTypeGet(field.value.type));
        code += "($this->__vector($o) + $j * ";
        code += NumToString(InlineSize(vectortype)) + ") : ";
        code += GenDefaultValue(field.value) + ";\n";
      }
      code += Indent + "}\n\n";
    }

    // Recursively generate arguments for a constructor, to deal with nested
    // structs.
    static void StructBuilderArgs(const StructDef &struct_def,
      const char *nameprefix,
      std::string *code_ptr) {
      for (auto it = struct_def.fields.vec.begin();
      it != struct_def.fields.vec.end();
        ++it) {
        auto &field = **it;
        if (IsStruct(field.value.type)) {
          // Generate arguments for a struct inside a struct. To ensure names
          // don't clash, and to make it obvious
          // these arguments are constructing
          // a nested struct, prefix the name with the field name.
          StructBuilderArgs(*field.value.type.struct_def,
            (nameprefix + (field.name + "_")).c_str(),
            code_ptr);
        } else {
          std::string &code = *code_ptr;
          code += (std::string)", $" + nameprefix;
          code += MakeCamel(field.name, false);
        }
      }
    }

    // Recursively generate struct construction statements and instert manual
    // padding.
    static void StructBuilderBody(const StructDef &struct_def,
      const char *nameprefix,
      std::string *code_ptr) {
      std::string &code = *code_ptr;
      code += Indent + Indent + "$builder->prep(";
      code += NumToString(struct_def.minalign) + ", ";
      code += NumToString(struct_def.bytesize) + ");\n";
      for (auto it = struct_def.fields.vec.rbegin();
      it != struct_def.fields.vec.rend();
        ++it) {
        auto &field = **it;
        if (field.padding) {
          code += Indent + Indent + "$builder->pad(";
          code += NumToString(field.padding) + ");\n";
        }
        if (IsStruct(field.value.type)) {
          StructBuilderBody(*field.value.type.struct_def,
            (nameprefix + (field.name + "_")).c_str(),
            code_ptr);
        } else {
          code += Indent + Indent + "$builder->put" + GenMethod(field) + "($";
          code += nameprefix + MakeCamel(field.name, false) + ");\n";
        }
      }
    }

    // Get the value of a table's starting offset.
    static void GetStartOfTable(const StructDef &struct_def,
      std::string *code_ptr) {
      std::string &code = *code_ptr;

      code += Indent + "/**\n";
      code += Indent + " * @param FlatBufferBuilder $builder\n";
      code += Indent + " * @return void\n";
      code += Indent + " */\n";
      code += Indent + "public static function start" + struct_def.name;
      code += "(FlatBufferBuilder $builder)\n";
      code += Indent + "{\n";
      code += Indent + Indent + "$builder->StartObject(";
      code += NumToString(struct_def.fields.vec.size());
      code += ");\n";
      code += Indent + "}\n\n";

      code += Indent + "/**\n";
      code += Indent + " * @param FlatBufferBuilder $builder\n";
      code += Indent + " * @return " + struct_def.name + "\n";
      code += Indent + " */\n";
      code += Indent + "public static function create" + struct_def.name;
      code += "(FlatBufferBuilder $builder, ";

      for (auto it = struct_def.fields.vec.begin();
      it != struct_def.fields.vec.end();
        ++it) {
        auto &field = **it;

        if (field.deprecated) continue;
        code += "$" + field.name;
        if (!(it == (--struct_def.fields.vec.end()))) {
          code += ", ";
        }
      }
      code += ")\n";
      code += Indent + "{\n";
      code += Indent + Indent + "$builder->startObject(";
      code += NumToString(struct_def.fields.vec.size());
      code += ");\n";
      for (auto it = struct_def.fields.vec.begin();
      it != struct_def.fields.vec.end();
        ++it) {
        auto &field = **it;
        if (field.deprecated) continue;

        code += Indent + Indent + "self::add";
        code += MakeCamel(field.name) + "($builder, $" + field.name + ");\n";
      }

      code += Indent + Indent + "$o = $builder->endObject();\n";

      for (auto it = struct_def.fields.vec.begin();
      it != struct_def.fields.vec.end();
        ++it) {
        auto &field = **it;
        if (!field.deprecated && field.required) {
          code += Indent + Indent + "$builder->required($o, ";
          code += NumToString(field.value.offset);
          code += ");  // " + field.name + "\n";
        }
      }
      code += Indent + Indent + "return $o;\n";
      code += Indent + "}\n\n";
    }

    // Set the value of a table's field.
    static void BuildFieldOfTable(const FieldDef &field,
      const size_t offset,
      std::string *code_ptr) {
      std::string &code = *code_ptr;


      code += Indent + "/**\n";
      code += Indent + " * @param FlatBufferBuilder $builder\n";
      code += Indent + " * @param " + GenTypeBasic(field.value.type) + "\n";
      code += Indent + " * @return void\n";
      code += Indent + " */\n";
      code += Indent + "public static function ";
      code += "add" + MakeCamel(field.name);
      code += "(FlatBufferBuilder $builder, ";
      code += "$" + MakeCamel(field.name, false);
      code += ")\n";
      code += Indent + "{\n";
      code += Indent + Indent + "$builder->add";
      code += GenMethod(field) + "X(";
      code += NumToString(offset) + ", ";


      code += "$" + MakeCamel(field.name, false);
      code += ", ";

      if (field.value.type.base_type == BASE_TYPE_BOOL) {
        code += "false";
      } else {
        code += field.value.constant;
      }
      code += ");\n";
      code += Indent + "}\n\n";
    }

    // Set the value of one of the members of a table's vector.
    static void BuildVectorOfTable(const FieldDef &field,
      std::string *code_ptr) {
      std::string &code = *code_ptr;

      auto vector_type = field.value.type.VectorType();
      auto alignment = InlineAlignment(vector_type);
      auto elem_size = InlineSize(vector_type);
      code += Indent + "/**\n";
      code += Indent + " * @param FlatBufferBuilder $builder\n";
      code += Indent + " * @param array offset array\n";
      code += Indent + " * @return int vector offset\n";
      code += Indent + " */\n";
      code += Indent + "public static function create";
      code += MakeCamel(field.name);
      code += "Vector(FlatBufferBuilder $builder, array $data)\n";
      code += Indent + "{\n";
      code += Indent + Indent + "$builder->startVector(";
      code += NumToString(elem_size);
      code += ", count($data), " + NumToString(alignment);
      code += ");\n";
      code += Indent + Indent;
      code += "for ($i = count($data) - 1; $i >= 0; $i--) {\n";
      if (IsScalar(field.value.type.VectorType().base_type)) {
        code += Indent + Indent + Indent;
        code += "$builder->add";
        code += MakeCamel(GenTypeBasic(field.value.type.VectorType()));
        code += "($data[$i]);\n";
      } else {
        code += Indent + Indent + Indent;
        code += "$builder->addOffset($data[$i]);\n";
      }
      code += Indent + Indent + "}\n";
      code += Indent + Indent + "return $builder->endVector();\n";
      code += Indent + "}\n\n";


      code += Indent + "/**\n";
      code += Indent + " * @param FlatBufferBuilder $builder\n";
      code += Indent + " * @param int $numElems\n";
      code += Indent + " * @return void\n";
      code += Indent + " */\n";
      code += Indent + "public static function start";
      code += MakeCamel(field.name);
      code += "Vector(FlatBufferBuilder $builder, $numElems)\n";
      code += Indent + "{\n";
      code += Indent + Indent +  "$builder->startVector(";
      code += NumToString(elem_size);
      code += ", $numElems, " + NumToString(alignment);
      code += ");\n";
      code += Indent + "}\n\n";
    }

    // Get the offset of the end of a table.
    void GetEndOffsetOnTable(const StructDef &struct_def, std::string *code_ptr) {
      std::string &code = *code_ptr;


      code += Indent + "/**\n";
      code += Indent + " * @param FlatBufferBuilder $builder\n";
      code += Indent + " * @return int table offset\n";
      code += Indent + " */\n";
      code += Indent + "public static function end" + struct_def.name;
      code += "(FlatBufferBuilder $builder)\n";
      code += Indent + "{\n";
      code += Indent + Indent + "$o = $builder->endObject();\n";


      for (auto it = struct_def.fields.vec.begin();
      it != struct_def.fields.vec.end();
        ++it) {
        auto &field = **it;
        if (!field.deprecated && field.required) {
          code += Indent + Indent + "$builder->required($o, ";
          code += NumToString(field.value.offset);
          code += ");  // " + field.name + "\n";
        }
      }
      code += Indent + Indent + "return $o;\n";
      code += Indent + "}\n";

      if (parser_.root_struct_def_ == &struct_def) {
        code += "\n";
        code += Indent + "public static function finish";
        code += struct_def.name;
        code += "Buffer(FlatBufferBuilder $builder, $offset)\n";
        code += Indent + "{\n";
        code += Indent + Indent + "$builder->finish($offset";

        if (parser_.file_identifier_.length())
          code += ", \"" + parser_.file_identifier_ + "\"";
        code += ");\n";
        code += Indent + "}\n";
      }
    }

  // Generate a struct field, conditioned on its child type(s).
    void GenStructAccessor(const StructDef &struct_def, const FieldDef &field,
      std::string *code_ptr) {
      GenComment(field.doc_comment, code_ptr, nullptr);

      if (IsScalar(field.value.type.base_type)) {
        if (struct_def.fixed) {
          GetScalarFieldOfStruct(field, code_ptr);
        } else {
          GetScalarFieldOfTable(field, code_ptr);
        }
      } else {
        switch (field.value.type.base_type) {
        case BASE_TYPE_STRUCT:
          if (struct_def.fixed) {
            GetStructFieldOfStruct(field, code_ptr);
          } else {
            GetStructFieldOfTable(field, code_ptr);
          }
          break;
        case BASE_TYPE_STRING:
          GetStringField(field, code_ptr);
          break;
        case BASE_TYPE_VECTOR: {
          auto vectortype = field.value.type.VectorType();
          if (vectortype.base_type == BASE_TYPE_STRUCT) {
            GetMemberOfVectorOfStruct(struct_def, field, code_ptr);
          } else {
            GetMemberOfVectorOfNonStruct(field, code_ptr);
          }
          break;
        }
        case BASE_TYPE_UNION:
          GetUnionField(field, code_ptr);
          break;
        default:
          assert(0);
        }
      }
      if (field.value.type.base_type == BASE_TYPE_VECTOR) {
        GetVectorLen(field, code_ptr);
        if (field.value.type.element == BASE_TYPE_UCHAR) {
          GetUByte(field, code_ptr);
        }
      }
    }

    // Generate table constructors, conditioned on its members' types.
    void GenTableBuilders(const StructDef &struct_def, std::string *code_ptr) {
      GetStartOfTable(struct_def, code_ptr);

      for (auto it = struct_def.fields.vec.begin();
      it != struct_def.fields.vec.end();
        ++it) {
        auto &field = **it;
        if (field.deprecated) continue;

        auto offset = it - struct_def.fields.vec.begin();
        if (field.value.type.base_type == BASE_TYPE_UNION) {
          std::string &code = *code_ptr;
          code += Indent + "public static function add";
          code += MakeCamel(field.name);
          code += "(FlatBufferBuilder $builder, $offset)\n";
          code += Indent + "{\n";
          code += Indent + Indent + "$builder->addOffsetX(";
          code += NumToString(offset) + ", $offset, 0);\n";
          code += Indent + "}\n\n";
        } else {
          BuildFieldOfTable(field, offset, code_ptr);
        }
        if (field.value.type.base_type == BASE_TYPE_VECTOR) {
          BuildVectorOfTable(field, code_ptr);
        }
      }

      GetEndOffsetOnTable(struct_def, code_ptr);
    }

    // Generate struct or table methods.
    void GenStruct(const StructDef &struct_def,
      std::string *code_ptr) {
      if (struct_def.generated) return;

      GenComment(struct_def.doc_comment, code_ptr, nullptr);
      BeginClass(struct_def, code_ptr);

      if (!struct_def.fixed) {
        // Generate a special accessor for the table that has been declared as
        // the root type.
        NewRootTypeFromBuffer(struct_def, code_ptr);
      }

      std::string &code = *code_ptr;
      if (!struct_def.fixed) {
        if (parser_.file_identifier_.length()) {
          // Return the identifier
          code += Indent + "public static function " + struct_def.name;
          code += "Identifier()\n";
          code += Indent + "{\n";
          code += Indent + Indent + "return \"";
          code += parser_.file_identifier_ + "\";\n";
          code += Indent + "}\n\n";

          // Check if a buffer has the identifier.
          code += Indent + "public static function " + struct_def.name;
          code += "BufferHasIdentifier(ByteBuffer $buf)\n";
          code += Indent + "{\n";
          code += Indent + Indent + "return self::";
          code += "__has_identifier($buf, self::";
          code += struct_def.name + "Identifier());\n";
          code += Indent + "}\n\n";
        }

        if (parser_.file_extension_.length()) {
          // Return the extension
          code += Indent + "public static function " + struct_def.name;
          code += "Extension()\n";
          code += Indent + "{\n";
          code += Indent + Indent + "return \"" + parser_.file_extension_;
          code += "\";\n";
          code += Indent + "}\n\n";
        }
      }

      // Generate the Init method that sets the field in a pre-existing
      // accessor object. This is to allow object reuse.
      InitializeExisting(struct_def, code_ptr);
      for (auto it = struct_def.fields.vec.begin();
      it != struct_def.fields.vec.end();
        ++it) {
        auto &field = **it;
        if (field.deprecated) continue;

        GenStructAccessor(struct_def, field, code_ptr);
      }

      if (struct_def.fixed) {
        // create a struct constructor function
        GenStructBuilder(struct_def, code_ptr);
      } else {
        // Create a set of functions that allow table construction.
        GenTableBuilders(struct_def, code_ptr);
      }
      EndClass(code_ptr);
    }

    // Generate enum declarations.
    static void GenEnum(const EnumDef &enum_def, std::string *code_ptr) {
      if (enum_def.generated) return;

      GenComment(enum_def.doc_comment, code_ptr, nullptr);
      BeginEnum(enum_def.name, code_ptr);
      for (auto it = enum_def.vals.vec.begin();
      it != enum_def.vals.vec.end();
        ++it) {
        auto &ev = **it;
        GenComment(ev.doc_comment, code_ptr, nullptr);
        EnumMember(ev, code_ptr);
      }

      std::string &code = *code_ptr;
      code += "\n";
      code += Indent + "private static $names = array(\n";
      for (auto it = enum_def.vals.vec.begin();
        it != enum_def.vals.vec.end(); ++it) {
        auto &ev = **it;
        code += Indent + Indent + "\"" + ev.name + "\",\n";
      }

      code += Indent + ");\n\n";
      code += Indent + "public static function Name($e)\n";
      code += Indent + "{\n";
      code += Indent + Indent + "if (!isset(self::$names[$e])) {\n";
      code += Indent + Indent + Indent + "throw new \\Exception();\n";
      code += Indent + Indent + "}\n";
      code += Indent + Indent + "return self::$names[$e];\n";
      code += Indent + "}\n";
      EndEnum(code_ptr);
    }

    // Returns the function name that is able to read a value of the given type.
    static std::string GenGetter(const Type &type) {
      switch (type.base_type) {
      case BASE_TYPE_STRING: return "__string";
      case BASE_TYPE_STRUCT: return "__struct";
      case BASE_TYPE_UNION: return "__union";
      case BASE_TYPE_VECTOR: return GenGetter(type.VectorType());
      default:
        return "Get";
      }
    }

    // Returns the method name for use with add/put calls.
    static std::string GenMethod(const FieldDef &field) {
      return IsScalar(field.value.type.base_type)
        ? MakeCamel(GenTypeBasic(field.value.type))
        : (IsStruct(field.value.type) ? "Struct" : "Offset");
    }

    static std::string GenTypeBasic(const Type &type) {
      static const char *ctypename[] = {
#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \
    #NTYPE,
        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
#undef FLATBUFFERS_TD
      };
      return ctypename[type.base_type];
    }

    std::string GenDefaultValue(const Value &value) {
      if (value.type.enum_def) {
        if (auto val = value.type.enum_def->ReverseLookup(
          atoi(value.constant.c_str()), false)) {
          return WrapInNameSpace(*value.type.enum_def) + "::" + val->name;
        }
      }

      switch (value.type.base_type) {
      case BASE_TYPE_BOOL:
        return value.constant == "0" ? "false" : "true";

      case BASE_TYPE_STRING:
        return "null";

      case BASE_TYPE_LONG:
      case BASE_TYPE_ULONG:
        if (value.constant != "0") {
          int64_t constant = StringToInt(value.constant.c_str());
          return NumToString(constant);
        }
        return "0";

      default:
        return value.constant;
      }
    }

    static std::string GenTypePointer(const Type &type) {
      switch (type.base_type) {
      case BASE_TYPE_STRING:
        return "string";
      case BASE_TYPE_VECTOR:
        return GenTypeGet(type.VectorType());
      case BASE_TYPE_STRUCT:
        return type.struct_def->name;
      case BASE_TYPE_UNION:
        // fall through
      default:
        return "Table";
      }
    }

    static std::string GenTypeGet(const Type &type) {
      return IsScalar(type.base_type)
        ? GenTypeBasic(type)
        : GenTypePointer(type);
    }

    // Create a struct with a builder and the struct's arguments.
    static void GenStructBuilder(const StructDef &struct_def,
      std::string *code_ptr) {
      std::string &code = *code_ptr;
      code += "\n";
      code += Indent + "/**\n";
      code += Indent + " * @return int offset\n";
      code += Indent + " */\n";
      code += Indent + "public static function create" + struct_def.name;
      code += "(FlatBufferBuilder $builder";
      StructBuilderArgs(struct_def, "", code_ptr);
      code += ")\n";
      code += Indent + "{\n";

      StructBuilderBody(struct_def, "", code_ptr);

      code += Indent + Indent + "return $builder->offset();\n";
      code += Indent + "}\n";
    }

    };
    }  // namespace php

    bool GeneratePhp(const Parser &parser, const std::string &path,
                     const std::string &file_name) {
      php::PhpGenerator generator(parser, path, file_name);
      return generator.generate();
    }
    }  // namespace flatbuffers
