// Copyright 2021 The Tint Authors.
//
// 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.

#ifndef SRC_TINT_INSPECTOR_TEST_INSPECTOR_BUILDER_H_
#define SRC_TINT_INSPECTOR_TEST_INSPECTOR_BUILDER_H_

#include <memory>
#include <string>
#include <tuple>
#include <vector>

#include "src/tint/ast/call_statement.h"
#include "src/tint/ast/disable_validation_attribute.h"
#include "src/tint/ast/id_attribute.h"
#include "src/tint/ast/stage_attribute.h"
#include "src/tint/ast/workgroup_attribute.h"
#include "src/tint/program_builder.h"
#include "src/tint/sem/depth_texture_type.h"
#include "src/tint/sem/external_texture_type.h"
#include "src/tint/sem/multisampled_texture_type.h"
#include "src/tint/sem/sampled_texture_type.h"
#include "src/tint/sem/variable.h"
#include "tint/tint.h"

namespace tint::inspector {

/// Utility class for building programs in inspector tests
class InspectorBuilder : public ProgramBuilder {
 public:
  InspectorBuilder();
  ~InspectorBuilder() override;

  /// Generates an empty function
  /// @param name name of the function created
  /// @param attributes the function attributes
  void MakeEmptyBodyFunction(std::string name, ast::AttributeList attributes);

  /// Generates a function that calls other functions
  /// @param caller name of the function created
  /// @param callees names of the functions to be called
  /// @param attributes the function attributes
  void MakeCallerBodyFunction(std::string caller,
                              std::vector<std::string> callees,
                              ast::AttributeList attributes);

  /// Generates a struct that contains user-defined IO members
  /// @param name the name of the generated struct
  /// @param inout_vars tuples of {name, loc} that will be the struct members
  /// @returns a structure object
  const ast::Struct* MakeInOutStruct(
      std::string name,
      std::vector<std::tuple<std::string, uint32_t>> inout_vars);

  // TODO(crbug.com/tint/697): Remove this.
  /// Add In/Out variables to the global variables
  /// @param inout_vars tuples of {in, out} that will be added as entries to the
  ///                   global variables
  void AddInOutVariables(
      std::vector<std::tuple<std::string, std::string>> inout_vars);

  // TODO(crbug.com/tint/697): Remove this.
  /// Generates a function that references in/out variables
  /// @param name name of the function created
  /// @param inout_vars tuples of {in, out} that will be converted into out = in
  ///                   calls in the function body
  /// @param attributes the function attributes
  void MakeInOutVariableBodyFunction(
      std::string name,
      std::vector<std::tuple<std::string, std::string>> inout_vars,
      ast::AttributeList attributes);

  // TODO(crbug.com/tint/697): Remove this.
  /// Generates a function that references in/out variables and calls another
  /// function.
  /// @param caller name of the function created
  /// @param callee name of the function to be called
  /// @param inout_vars tuples of {in, out} that will be converted into out = in
  ///                   calls in the function body
  /// @param attributes the function attributes
  /// @returns a function object
  const ast::Function* MakeInOutVariableCallerBodyFunction(
      std::string caller,
      std::string callee,
      std::vector<std::tuple<std::string, std::string>> inout_vars,
      ast::AttributeList attributes);

  /// Add a pipeline constant to the global variables, with a specific ID.
  /// @param name name of the variable to add
  /// @param id id number for the constant id
  /// @param type type of the variable
  /// @param constructor val to initialize the constant with, if NULL no
  ///             constructor will be added.
  /// @returns the constant that was created
  const ast::Variable* AddOverridableConstantWithID(
      std::string name,
      uint32_t id,
      const ast::Type* type,
      const ast::Expression* constructor) {
    return Override(name, type, constructor, {Id(id)});
  }

  /// Add a pipeline constant to the global variables, without a specific ID.
  /// @param name name of the variable to add
  /// @param type type of the variable
  /// @param constructor val to initialize the constant with, if NULL no
  ///             constructor will be added.
  /// @returns the constant that was created
  const ast::Variable* AddOverridableConstantWithoutID(
      std::string name,
      const ast::Type* type,
      const ast::Expression* constructor) {
    return Override(name, type, constructor);
  }

  /// Generates a function that references module-scoped, plain-typed constant
  /// or variable.
  /// @param func name of the function created
  /// @param var name of the constant to be reference
  /// @param type type of the const being referenced
  /// @param attributes the function attributes
  /// @returns a function object
  const ast::Function* MakePlainGlobalReferenceBodyFunction(
      std::string func,
      std::string var,
      const ast::Type* type,
      ast::AttributeList attributes);

  /// @param vec Vector of StageVariable to be searched
  /// @param name Name to be searching for
  /// @returns true if name is in vec, otherwise false
  bool ContainsName(const std::vector<StageVariable>& vec,
                    const std::string& name);

  /// Builds a string for accessing a member in a generated struct
  /// @param idx index of member
  /// @param type type of member
  /// @returns a string for the member
  std::string StructMemberName(size_t idx, const ast::Type* type);

  /// Generates a struct type
  /// @param name name for the type
  /// @param member_types a vector of member types
  /// @returns a struct type
  const ast::Struct* MakeStructType(const std::string& name,
                                    std::vector<const ast::Type*> member_types);

  /// Generates a struct type from a list of member nodes.
  /// @param name name for the struct type
  /// @param members a vector of members
  /// @returns a struct type
  const ast::Struct* MakeStructTypeFromMembers(const std::string& name,
                                               ast::StructMemberList members);

  /// Generates a struct member with a specified index and type.
  /// @param index index of the field within the struct
  /// @param type the type of the member field
  /// @param attributes a list of attributes to apply to the member field
  /// @returns a struct member
  const ast::StructMember* MakeStructMember(size_t index,
                                            const ast::Type* type,
                                            ast::AttributeList attributes);

  /// Generates types appropriate for using in an uniform buffer
  /// @param name name for the type
  /// @param member_types a vector of member types
  /// @returns a struct type that has the layout for an uniform buffer.
  const ast::Struct* MakeUniformBufferType(
      const std::string& name,
      std::vector<const ast::Type*> member_types);

  /// Generates types appropriate for using in a storage buffer
  /// @param name name for the type
  /// @param member_types a vector of member types
  /// @returns a function that returns the created structure.
  std::function<const ast::TypeName*()> MakeStorageBufferTypes(
      const std::string& name,
      std::vector<const ast::Type*> member_types);

  /// Adds an uniform buffer variable to the program
  /// @param name the name of the variable
  /// @param type the type to use
  /// @param group the binding/group/ to use for the uniform buffer
  /// @param binding the binding number to use for the uniform buffer
  void AddUniformBuffer(const std::string& name,
                        const ast::Type* type,
                        uint32_t group,
                        uint32_t binding);

  /// Adds a workgroup storage variable to the program
  /// @param name the name of the variable
  /// @param type the type of the variable
  void AddWorkgroupStorage(const std::string& name, const ast::Type* type);

  /// Adds a storage buffer variable to the program
  /// @param name the name of the variable
  /// @param type the type to use
  /// @param access the storage buffer access control
  /// @param group the binding/group to use for the storage buffer
  /// @param binding the binding number to use for the storage buffer
  void AddStorageBuffer(const std::string& name,
                        const ast::Type* type,
                        ast::Access access,
                        uint32_t group,
                        uint32_t binding);

  /// Generates a function that references a specific struct variable
  /// @param func_name name of the function created
  /// @param struct_name name of the struct variabler to be accessed
  /// @param members list of members to access, by index and type
  void MakeStructVariableReferenceBodyFunction(
      std::string func_name,
      std::string struct_name,
      std::vector<std::tuple<size_t, const ast::Type*>> members);

  /// Adds a regular sampler variable to the program
  /// @param name the name of the variable
  /// @param group the binding/group to use for the storage buffer
  /// @param binding the binding number to use for the storage buffer
  void AddSampler(const std::string& name, uint32_t group, uint32_t binding);

  /// Adds a comparison sampler variable to the program
  /// @param name the name of the variable
  /// @param group the binding/group to use for the storage buffer
  /// @param binding the binding number to use for the storage buffer
  void AddComparisonSampler(const std::string& name,
                            uint32_t group,
                            uint32_t binding);

  /// Adds a sampler or texture variable to the program
  /// @param name the name of the variable
  /// @param type the type to use
  /// @param group the binding/group to use for the resource
  /// @param binding the binding number to use for the resource
  void AddResource(const std::string& name,
                   const ast::Type* type,
                   uint32_t group,
                   uint32_t binding);

  /// Add a module scope private variable to the progames
  /// @param name the name of the variable
  /// @param type the type to use
  void AddGlobalVariable(const std::string& name, const ast::Type* type);

  /// Generates a function that references a specific sampler variable
  /// @param func_name name of the function created
  /// @param texture_name name of the texture to be sampled
  /// @param sampler_name name of the sampler to use
  /// @param coords_name name of the coords variable to use
  /// @param base_type sampler base type
  /// @param attributes the function attributes
  /// @returns a function that references all of the values specified
  const ast::Function* MakeSamplerReferenceBodyFunction(
      const std::string& func_name,
      const std::string& texture_name,
      const std::string& sampler_name,
      const std::string& coords_name,
      const ast::Type* base_type,
      ast::AttributeList attributes);

  /// Generates a function that references a specific sampler variable
  /// @param func_name name of the function created
  /// @param texture_name name of the texture to be sampled
  /// @param sampler_name name of the sampler to use
  /// @param coords_name name of the coords variable to use
  /// @param array_index name of the array index variable to use
  /// @param base_type sampler base type
  /// @param attributes the function attributes
  /// @returns a function that references all of the values specified
  const ast::Function* MakeSamplerReferenceBodyFunction(
      const std::string& func_name,
      const std::string& texture_name,
      const std::string& sampler_name,
      const std::string& coords_name,
      const std::string& array_index,
      const ast::Type* base_type,
      ast::AttributeList attributes);

  /// Generates a function that references a specific comparison sampler
  /// variable.
  /// @param func_name name of the function created
  /// @param texture_name name of the depth texture to  use
  /// @param sampler_name name of the sampler to use
  /// @param coords_name name of the coords variable to use
  /// @param depth_name name of the depth reference to use
  /// @param base_type sampler base type
  /// @param attributes the function attributes
  /// @returns a function that references all of the values specified
  const ast::Function* MakeComparisonSamplerReferenceBodyFunction(
      const std::string& func_name,
      const std::string& texture_name,
      const std::string& sampler_name,
      const std::string& coords_name,
      const std::string& depth_name,
      const ast::Type* base_type,
      ast::AttributeList attributes);

  /// Gets an appropriate type for the data in a given texture type.
  /// @param sampled_kind type of in the texture
  /// @returns a pointer to a type appropriate for the coord param
  const ast::Type* GetBaseType(ResourceBinding::SampledKind sampled_kind);

  /// Gets an appropriate type for the coords parameter depending the the
  /// dimensionality of the texture being sampled.
  /// @param dim dimensionality of the texture being sampled
  /// @param scalar the scalar type
  /// @returns a pointer to a type appropriate for the coord param
  const ast::Type* GetCoordsType(ast::TextureDimension dim,
                                 const ast::Type* scalar);

  /// Generates appropriate types for a Read-Only StorageTexture
  /// @param dim the texture dimension of the storage texture
  /// @param format the texel format of the storage texture
  /// @returns the storage texture type
  const ast::Type* MakeStorageTextureTypes(ast::TextureDimension dim,
                                           ast::TexelFormat format);

  /// Adds a storage texture variable to the program
  /// @param name the name of the variable
  /// @param type the type to use
  /// @param group the binding/group to use for the sampled texture
  /// @param binding the binding57 number to use for the sampled texture
  void AddStorageTexture(const std::string& name,
                         const ast::Type* type,
                         uint32_t group,
                         uint32_t binding);

  /// Generates a function that references a storage texture variable.
  /// @param func_name name of the function created
  /// @param st_name name of the storage texture to use
  /// @param dim_type type expected by textureDimensons to return
  /// @param attributes the function attributes
  /// @returns a function that references all of the values specified
  const ast::Function* MakeStorageTextureBodyFunction(
      const std::string& func_name,
      const std::string& st_name,
      const ast::Type* dim_type,
      ast::AttributeList attributes);

  /// Get a generator function that returns a type appropriate for a stage
  /// variable with the given combination of component and composition type.
  /// @param component component type of the stage variable
  /// @param composition composition type of the stage variable
  /// @returns a generator function for the stage variable's type.
  std::function<const ast::Type*()> GetTypeFunction(
      ComponentType component,
      CompositionType composition);

  /// Build the Program given all of the previous methods called and return an
  /// Inspector for it.
  /// Should only be called once per test.
  /// @returns a reference to the Inspector for the built Program.
  Inspector& Build();

  /// @returns the type for a SamplerKind::kSampler
  const ast::Sampler* sampler_type() {
    return ty.sampler(ast::SamplerKind::kSampler);
  }

  /// @returns the type for a SamplerKind::kComparison
  const ast::Sampler* comparison_sampler_type() {
    return ty.sampler(ast::SamplerKind::kComparisonSampler);
  }

 protected:
  /// Program built by this builder.
  std::unique_ptr<Program> program_;
  /// Inspector for |program_|
  std::unique_ptr<Inspector> inspector_;
};

}  // namespace tint::inspector

#endif  // SRC_TINT_INSPECTOR_TEST_INSPECTOR_BUILDER_H_
