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

#include "flutter/fml/macros.h"
#include "flutter/fml/mapping.h"
#include "impeller/compiler/include_dir.h"
#include "shaderc/shaderc.hpp"

namespace impeller {
namespace compiler {

struct IncluderData {
  std::string file_name;
  std::unique_ptr<fml::Mapping> mapping;

  IncluderData(std::string p_file_name, std::unique_ptr<fml::Mapping> p_mapping)
      : file_name(std::move(p_file_name)), mapping(std::move(p_mapping)) {}
};

class Includer final : public shaderc::CompileOptions::IncluderInterface {
 public:
  Includer(std::shared_ptr<fml::UniqueFD> working_directory,
           std::vector<IncludeDir> include_dirs,
           std::function<void(std::string)> on_file_included);

  // |shaderc::CompileOptions::IncluderInterface|
  ~Includer() override;

  // |shaderc::CompileOptions::IncluderInterface|
  shaderc_include_result* GetInclude(const char* requested_source,
                                     shaderc_include_type type,
                                     const char* requesting_source,
                                     size_t include_depth) override;

  // |shaderc::CompileOptions::IncluderInterface|
  void ReleaseInclude(shaderc_include_result* data) override;

 private:
  std::shared_ptr<fml::UniqueFD> working_directory_;
  std::vector<IncludeDir> include_dirs_;
  std::function<void(std::string)> on_file_included_;

  std::unique_ptr<fml::FileMapping> TryOpenMapping(
      const IncludeDir& dir,
      const char* requested_source);

  std::unique_ptr<fml::FileMapping> FindFirstMapping(
      const char* requested_source);

  FML_DISALLOW_COPY_AND_ASSIGN(Includer);
};

}  // namespace compiler
}  // namespace impeller
