// 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 <string>

#include "flutter/fml/macros.h"
#include "flutter/fml/mapping.h"
#include "impeller/renderer/shader_function.h"
#include "impeller/renderer/shader_types.h"

namespace impeller {

enum RuntimeUniformType {
  kBoolean,
  kSignedByte,
  kUnsignedByte,
  kSignedShort,
  kUnsignedShort,
  kSignedInt,
  kUnsignedInt,
  kSignedInt64,
  kUnsignedInt64,
  kHalfFloat,
  kFloat,
  kDouble,
  kSampledImage,
};

struct RuntimeUniformDimensions {
  size_t rows = 0;
  size_t cols = 0;
};

struct RuntimeUniformDescription {
  std::string name;
  size_t location = 0u;
  RuntimeUniformType type = kFloat;
  RuntimeUniformDimensions dimensions;
  size_t bit_width;
};

size_t SizeOfRuntimeUniformType(RuntimeUniformType type);

class RuntimeStage {
 public:
  RuntimeStage(std::shared_ptr<fml::Mapping> payload);

  ~RuntimeStage();

  bool IsValid() const;

  ShaderStage GetShaderStage() const;

  const std::vector<RuntimeUniformDescription>& GetUniforms() const;

  const std::string& GetEntrypoint() const;

  const RuntimeUniformDescription* GetUniform(const std::string& name) const;

  const std::shared_ptr<fml::Mapping>& GetCodeMapping() const;

 private:
  ShaderStage stage_ = ShaderStage::kUnknown;
  std::shared_ptr<fml::Mapping> payload_;
  std::string entrypoint_;
  std::shared_ptr<fml::Mapping> code_mapping_;
  std::vector<RuntimeUniformDescription> uniforms_;
  bool is_valid_ = false;

  FML_DISALLOW_COPY_AND_ASSIGN(RuntimeStage);
};

}  // namespace impeller
