// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FIDES_SOURCE_DELEGATE_H_
#define FIDES_SOURCE_DELEGATE_H_

#include <functional>
#include <map>
#include <memory>
#include <string>

#include <base/macros.h>

#include "fides/blob_ref.h"

namespace fides {

class LockedSettingsContainer;
class LockedVersionComponent;
class SettingsService;

// A delegate interface for implementing behavior specific to a configuration
// source type. Subclasses implement specific logic for different approaches to
// key management, e.g. device owner keys.
class SourceDelegate {
 public:
  virtual ~SourceDelegate() = default;

  // Validates a version stamp component signed by the source.
  virtual bool ValidateVersionComponent(
      const LockedVersionComponent& component) const = 0;

  // Validates a blob.
  virtual bool ValidateContainer(
      const LockedSettingsContainer& container) const = 0;

 private:
  DISALLOW_ASSIGN(SourceDelegate);
};

// A trivial SourceDelegate implementation that fails all validation operations.
class DummySourceDelegate : public SourceDelegate {
 public:
  DummySourceDelegate() = default;
  virtual ~DummySourceDelegate() = default;

  // SourceDelegate:
  bool ValidateVersionComponent(
      const LockedVersionComponent& component) const override;
  bool ValidateContainer(
      const LockedSettingsContainer& container) const override;

 private:
  DISALLOW_COPY_AND_ASSIGN(DummySourceDelegate);
};

// A function type to create source delegates. Returns |nullptr| in case the
// source configuration in |settings| are invalid.
using SourceDelegateFactoryFunction =
    std::function<std::unique_ptr<SourceDelegate>(
        const std::string& source_id,
        const SettingsService& settings)>;

// This class implements a type-based source delegate factory function registry.
// Subordinate factory functions can be registered to service delegate creation
// requests for a specified type.
//
// Note that SourceDelegateFactory is not copyable, but can be wrapped in a
// std::reference for use as a SourceDelegateFactoryFunction.
class SourceDelegateFactory {
 public:
  SourceDelegateFactory() = default;

  // Creates a delegate for the given source ID. Looks up the delegate type in
  // |settings|, finds the corresponding factory function, creates a delegate
  // and returns it. |nullptr| will be returned if there is no suitable factory
  // function registered or the factory failed to create a delegate.
  std::unique_ptr<SourceDelegate> operator()(
      const std::string& source_id,
      const SettingsService& settings) const;

  // Register a new factory function to service
  void RegisterFunction(const std::string& type,
                        const SourceDelegateFactoryFunction& factory);

 private:
  // Maps type identifiers to the corresponding factories.
  std::map<std::string, SourceDelegateFactoryFunction> function_map_;

  DISALLOW_COPY_AND_ASSIGN(SourceDelegateFactory);
};

}  // namespace fides

#endif  // FIDES_SOURCE_DELEGATE_H_
