// Copyright 2017 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.

#pragma once

#include <functional>
#include <map>
#include <string>
#include <vector>

#include "parser/parser.h" // for FileCtx

constexpr size_t kMaxArgs = 8;

extern const std::map<std::string, std::string> rust_overrides;
extern const std::map<std::string, std::string> rust_primitives;
extern const std::map<std::string, std::string> rust_reserved_words;

struct ArraySpec {
    enum Kind : uint32_t {
        IN,
        OUT,
        INOUT
    };

    Kind kind;
    // Size of the array is specified in one of the two ways:
    //    1) a number in the range 1--9 ('count' is non-zero, 'multipliers' is empty)
    //    2) a sequence of one or more identifiers separated by '*',
    //       e.g. "foo * bar" or "foo" ('count' is zero, 'multipliers' is non-empty)
    uint32_t count;
    std::vector<std::string> multipliers;

    std::string kind_str() const;
    std::string kind_lowercase_str() const;
    bool assign_kind(const std::vector<std::string>& attrs);
    std::string to_string() const;
};

struct TypeSpec {
    std::string name;
    std::string type;
    std::vector<std::string> attributes;
    std::unique_ptr<ArraySpec> arr_spec;

    std::string to_string() const;
    std::string as_cpp_declaration(bool is_wrapped) const;
    std::string as_rust_declaration() const;
    std::string as_cpp_cast(const std::string& arg) const;
};

// The tokens of a line of requirements.
using Requirement = std::vector<std::string>;

// The tokens of a line of top-of-md description in the "NAME" block.
using TopDescription = std::vector<std::string>;

struct Syscall {
    // Move-only.
    Syscall(Syscall&&) = default;
    Syscall(const Syscall&) = delete;
    Syscall& operator=(const Syscall&) = delete;

    FileCtx fc;
    std::string name;
    int index = -1;
    std::vector<TypeSpec> ret_spec;
    std::vector<TypeSpec> arg_spec;
    std::vector<std::string> attributes;
    std::vector<Requirement> requirements;
    TopDescription top_description;

    Syscall(const FileCtx& sc_fc, const std::string& sc_name)
        : fc(sc_fc), name(sc_name) {}

    bool is_vdso() const;
    bool is_noreturn() const;
    bool is_blocking() const;
    bool is_internal() const;
    size_t num_kernel_args() const;
    void for_each_kernel_arg(const std::function<void(const TypeSpec&)>& cb) const;
    void for_each_return(const std::function<void(const TypeSpec&)>& cb) const;
    bool validate() const;
    void assign_index(int* next_index);
    bool validate_array_spec(const TypeSpec& ts) const;
    void print_error(const char* what) const;
    std::string return_type() const;
    bool is_void_return() const;
};

const std::string map_override(
    const std::string& name, const std::map<std::string, std::string>& overrides);
bool has_attribute(const char* attr, const std::vector<std::string>& attrs);
void dump_attributes(const std::vector<std::string>& attrs);
