// 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 <type_traits>
#include <unordered_map>

#include "flutter/fml/hash_combine.h"
#include "flutter/fml/macros.h"
#include "flutter/fml/mapping.h"
#include "impeller/blobcat/blob_types.h"

namespace impeller {

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

  BlobLibrary(BlobLibrary&&);

  ~BlobLibrary();

  bool IsValid() const;

  size_t GetShaderCount() const;

  std::shared_ptr<fml::Mapping> GetMapping(BlobShaderType type,
                                           std::string name) const;

  size_t IterateAllBlobs(
      std::function<bool(BlobShaderType type,
                         const std::string& name,
                         const std::shared_ptr<fml::Mapping>& mapping)>) const;

 private:
  struct BlobKey {
    BlobShaderType type = BlobShaderType::kFragment;
    std::string name;

    struct Hash {
      size_t operator()(const BlobKey& key) const {
        return fml::HashCombine(
            static_cast<std::underlying_type_t<decltype(key.type)>>(key.type),
            key.name);
      }
    };

    struct Equal {
      bool operator()(const BlobKey& lhs, const BlobKey& rhs) const {
        return lhs.type == rhs.type && lhs.name == rhs.name;
      }
    };
  };

  using Blobs = std::unordered_map<BlobKey,
                                   std::shared_ptr<fml::Mapping>,
                                   BlobKey::Hash,
                                   BlobKey::Equal>;

  std::shared_ptr<fml::Mapping> payload_;
  Blobs blobs_;
  bool is_valid_ = false;

  FML_DISALLOW_COPY_AND_ASSIGN(BlobLibrary);
};

}  // namespace impeller
