// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_C_GENERATOR_H_
#define ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_C_GENERATOR_H_

#include <sstream>
#include <string>
#include <vector>

#include "coded_ast.h"
#include "flat_ast.h"
#include "string_view.h"

namespace fidl {

// Methods or functions named "Emit..." are the actual interface to
// the C output.

// Methods named "Generate..." directly generate C output, to either
// the header or source file, via the "Emit" routines.

// Methods named "Produce..." indirectly generate C output by calling
// the Generate methods, and should not call the "Emit" functions
// directly.

class CGenerator {
public:
    explicit CGenerator(flat::Library* library) : library_(library) {}

    ~CGenerator() = default;

    void ProduceCStructs(std::ostringstream* header_file_out);

    enum struct IntegerConstantType {
        kStatus,
        kInt8,
        kInt16,
        kInt32,
        kInt64,
        kUint8,
        kUint16,
        kUint32,
        kUint64,
    };

    struct Member {
        std::string type;
        std::string name;
        std::vector<uint32_t> array_counts;
    };

 private:
    struct NamedConst {
        std::string name;
        const flat::Const& const_info;
    };

    struct NamedEnum {
        std::string name;
        const flat::Enum& enum_info;
    };

    struct NamedMessage {
        std::string c_name;
        std::string coded_name;
        const std::vector<flat::Interface::Method::Parameter>& parameters;
    };

    struct NamedStruct {
        std::string c_name;
        std::string coded_name;
        const flat::Struct& struct_info;
    };

    struct NamedUnion {
        std::string name;
        const flat::Union& union_info;
    };

    void GeneratePrologues();
    void GenerateEpilogues();

    void GenerateIntegerDefine(StringView name, IntegerConstantType type, StringView value);
    void GenerateIntegerTypedef(IntegerConstantType type, StringView name);
    void GenerateStructTypedef(StringView name);

    void GenerateStructDeclaration(StringView name, const std::vector<Member>& members);
    void GenerateTaggedUnionDeclaration(StringView name, const std::vector<Member>& members);

    void MaybeProduceCodingField(std::string field_name, uint32_t offset, const ast::Type* type,
                                 std::vector<coded::Field>* fields);

    std::vector<NamedConst> NameConsts(const std::vector<flat::Const>& const_infos);
    std::vector<NamedEnum> NameEnums(const std::vector<flat::Enum>& enum_infos);
    std::vector<NamedMessage> NameInterfaces(const std::vector<flat::Interface>& interface_infos);
    std::vector<NamedStruct> NameStructs(const std::vector<flat::Struct>& struct_infos);
    std::vector<NamedUnion> NameUnions(const std::vector<flat::Union>& union_infos);

    void ProduceConstForwardDeclaration(const NamedConst& named_const);
    void ProduceEnumForwardDeclaration(const NamedEnum& named_enum);
    void ProduceMessageForwardDeclaration(const NamedMessage& named_message);
    void ProduceStructForwardDeclaration(const NamedStruct& named_struct);
    void ProduceUnionForwardDeclaration(const NamedUnion& named_union);

    void ProduceMessageExternDeclaration(const NamedMessage& named_message);

    void ProduceConstDeclaration(const NamedConst& named_const);
    void ProduceMessageDeclaration(const NamedMessage& named_message);
    void ProduceStructDeclaration(const NamedStruct& named_struct);
    void ProduceUnionDeclaration(const NamedUnion& named_union);

    flat::Library* library_;
    std::ostringstream header_file_;
};

} // namespace fidl

#endif // ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_C_GENERATOR_H_
