// Copyright 2019 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 SRC_SYS_ACTIVITY_STATE_MACHINE_DRIVER_H_
#define SRC_SYS_ACTIVITY_STATE_MACHINE_DRIVER_H_

#include <fuchsia/ui/activity/cpp/fidl.h>
#include <lib/async/cpp/task.h>
#include <lib/async/cpp/time.h>
#include <lib/async/dispatcher.h>
#include <lib/fit/function.h>
#include <lib/zx/time.h>

#include <set>

#include "src/lib/fxl/macros.h"
#include "src/lib/fxl/memory/weak_ptr.h"
#include "src/sys/activity/activity_state_machine.h"
#include "src/sys/activity/common.h"

namespace activity {

using VoidCallback = fit::function<void()>;

using StateChangedCallback =
    fit::function<void(fuchsia::ui::activity::State state, zx::time transition_time)>;

// StateMachineDriver is a class which drives an ActivityStateMachine based on user activity.
//
// The responsibilities of the StateMachineDriver are:
//  - To receive inputs and forward them to the state machine in a sequential manner, and
//  - To manage timers which drive the state machine in the absence of any inputs.
//
// StateMachineDriver dispatches work onto an asynchronous loop, which ensures sequential processing
// of events from different sources (e.g. user input v.s.  automated timers).
class StateMachineDriver {
 public:
  explicit StateMachineDriver(async_dispatcher_t* dispatcher)
      : last_transition_time_(async::Now(dispatcher)),
        dispatcher_(dispatcher),
        weak_factory_(this) {}
  ~StateMachineDriver() = default;

  fuchsia::ui::activity::State GetState() const;

  const ActivityStateMachine& state_machine() const { return state_machine_; };

  zx_status_t RegisterObserver(ObserverId id, StateChangedCallback callback);
  zx_status_t UnregisterObserver(ObserverId id);
  // Exposed for testing
  size_t num_observers() const { return observers_.size(); }

  // Inputs to the state machine. These methods enqueue a work item onto the driver's async loop to
  // handle the given activity, scheduling the work item to run at |time|.
  // If |time| was before the last state transition, it is ignored and ZX_ERR_OUT_OF_BOUNDS is
  // returned. (Events may be interpreted differently depending on the current state.)
  //
  // |callback| is invoked once the work item on the async loop is executed. If an error is
  // returned, |callback| is invoked immediately and synchronously.
  zx_status_t ReceiveDiscreteActivity(const fuchsia::ui::activity::DiscreteActivity& activity,
                                      zx::time time, VoidCallback callback);
  zx_status_t StartOngoingActivity(OngoingActivityId id, zx::time time, VoidCallback callback);
  zx_status_t EndOngoingActivity(OngoingActivityId id, zx::time time, VoidCallback callback);

  // Force the state machine into |state|.
  //
  // The state machine will continue to receive and process input, but observers will only be
  // notified of |state| and any future states set through this method.
  //
  // Passing std::nullopt will disable the override, which has the following effects:
  //  - Immediately notifies all listeners of the actual state of the state machine
  //  - Returns the state machine to its original behavior, where observers are notified of
  //    state transitions occuring due to received inputs.
  void SetOverrideState(std::optional<fuchsia::ui::activity::State> state);

 private:
  void ProcessEvent(const Event& event, zx::time time);
  void ProcessActivityStart(OngoingActivityId id);
  void ProcessActivityEnd(OngoingActivityId id);

  void StartTimer(zx::duration delay);
  void HandleTimeout();

  void NotifyObservers(fuchsia::ui::activity::State state, zx::time time) const;

  // An optional state override. When set, the state from state_machine_ continues to be updated,
  // but changes to that state are not sent to observers. See SetOverrideState() for details.
  std::optional<fuchsia::ui::activity::State> override_state_;

  // Underlying state machine.
  ActivityStateMachine state_machine_;

  // The time of the most recent state transition.
  zx::time last_transition_time_;

  // Dispatcher to run operations on.
  async_dispatcher_t* dispatcher_;

  // Observers to be notified whenever a state transition occurs.
  std::map<ObserverId, StateChangedCallback> observers_;

  // Set of ongoing activities. Activity IDs are added to this set by ProcessActivityStart() and
  // are removed by ProcessActivityEnd().
  //
  // While the map is non-empty, it is assumed that an activity is ongoing and thus no TIMEOUT
  // events will be delivered to the state machine.
  std::set<OngoingActivityId> ongoing_activities_;

  // A task which is posted on |dispatcher_| to trigger a timeout from a particular state.
  // The task is posted when a state with a timeout is entered.
  // The task is re-posted whenever an event is received.
  // The task is cancelled if a state which has no timeout is entered, or if an ongoing activity
  // starts.
  async::TaskClosureMethod<StateMachineDriver, &StateMachineDriver::HandleTimeout> timeout_task_{
      this};

  // Generates weak references to this object, which are appropriate to pass into asynchronous
  // callbacks that need to access this object. (The references are automatically invalidated
  // if this object is destroyed.)
  fxl::WeakPtrFactory<StateMachineDriver> weak_factory_;

  FXL_DISALLOW_COPY_AND_ASSIGN(StateMachineDriver);
};

}  // namespace activity

#endif  // SRC_SYS_ACTIVITY_STATE_MACHINE_DRIVER_H_
