// Copyright 2013 The Flutter 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 <memory>
#include <utility>
#include <variant>

#include "flutter/fml/logging.h"
#include "flutter/fml/macros.h"
#include "spirv_glsl.hpp"

namespace impeller {
namespace compiler {

class CompilerSkSL : public spirv_cross::CompilerGLSL {
 public:
  explicit CompilerSkSL(std::vector<uint32_t> spirv_)
      : CompilerGLSL(std::move(spirv_)) {}

  CompilerSkSL(const uint32_t* ir_, size_t word_count)
      : CompilerGLSL(ir_, word_count) {}

  explicit CompilerSkSL(const spirv_cross::ParsedIR& ir_)
      : spirv_cross::CompilerGLSL(ir_) {}

  explicit CompilerSkSL(spirv_cross::ParsedIR&& ir_)
      : spirv_cross::CompilerGLSL(std::move(ir_)) {}

  std::string compile() override;

 private:
  std::string output_name_;

  void emit_header() override;

  void emit_uniform(const spirv_cross::SPIRVariable& var) override;

  void fixup_user_functions();

  void detect_unsupported_resources();
  bool emit_constant_resources();
  bool emit_struct_resources();
  bool emit_uniform_resources();
  bool emit_output_resources();
  bool emit_global_variable_resources();
  void emit_resources();

  void emit_interface_block(const spirv_cross::SPIRVariable& var);

  void emit_function_prototype(
      spirv_cross::SPIRFunction& func,
      const spirv_cross::Bitset& return_flags) override;

  std::string image_type_glsl(const spirv_cross::SPIRType& type,
                              uint32_t id = 0) override;

  std::string builtin_to_glsl(spv::BuiltIn builtin,
                              spv::StorageClass storage) override;

  std::string to_texture_op(
      const spirv_cross::Instruction& i,
      bool sparse,
      bool* forward,
      spirv_cross::SmallVector<uint32_t>& inherited_expressions) override;

  std::string to_function_name(
      const spirv_cross::CompilerGLSL::TextureFunctionNameArguments& args)
      override;

  std::string to_function_args(
      const spirv_cross::CompilerGLSL::TextureFunctionArguments& args,
      bool* p_forward) override;
};

}  // namespace compiler
}  // namespace impeller
