// Copyright 2018 The Fuchsia 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 PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MUTATOR_H_
#define PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MUTATOR_H_

#include <fuchsia/modular/storymodel/cpp/fidl.h>
#include <lib/fit/bridge.h>
#include <lib/fxl/macros.h>

namespace modular {

// Implemented by and created by the StoryModelOwner.
//
// An instance of StoryMutator is provided to all clients that wish to perform
// mutations on a StoryModel. It is responsible for consuming mutation commands
// (exposed as methods publicly and converted to StoryModelMutation internally)
// and dispatching them be applied to a shared StoryModel instance.
//
// This is an interface in order to aid in testing clients that depend on
// StoryMutator.
class StoryMutator {
 public:
  StoryMutator();
  virtual ~StoryMutator();

  // The following mutators issue a single mutation instruction to
  // change the StoryModel.
  //
  // The returned fit::consumer<> will eventually be completed with the result
  // of the mutation operation, HOWEVER success does not guarantee that
  // observers of the StoryModel will see those same changes reflected, and thus
  // clients should NOT perform side-effects under that assumption.
  //
  // It IS safe to perform side-effects once mutations have been observed
  // through StoryObserver.
  //
  // A failure guarantees that the mutation was not applied and it is safe to
  // retry.

  // Sets the value of |StoryModel.runtime_state|.
  fit::consumer<> set_runtime_state(
      fuchsia::modular::StoryState state);

  // Sets the value of |StoryModel.visibility_state|.
  fit::consumer<> set_visibility_state(
      fuchsia::modular::StoryVisibilityState state);

 private:
  // Executes |commands| in order and in a single transaction.
  virtual fit::consumer<> ExecuteInternal(
      std::vector<fuchsia::modular::storymodel::StoryModelMutation>
          commands) = 0;

  FXL_DISALLOW_COPY_AND_ASSIGN(StoryMutator);
};

}  // namespace modular

#endif  // PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MUTATOR_H_
