// Copyright 2016 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_EXAMPLES_TODO_CPP_TODO_H_
#define PERIDOT_EXAMPLES_TODO_CPP_TODO_H_

#include <random>

#include <fuchsia/ledger/cpp/fidl.h>
#include <fuchsia/modular/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/component/cpp/startup_context.h>
#include <lib/fidl/cpp/binding.h>
#include <src/lib/fxl/command_line.h>
#include <src/lib/fxl/macros.h>

#include "peridot/examples/todo_cpp/generator.h"

namespace todo {

using Key = std::vector<uint8_t>;

class TodoApp : public fuchsia::ledger::PageWatcher,
                fuchsia::modular::Lifecycle {
 public:
  TodoApp(async::Loop* loop);

  // fuchsia::ledger::PageWatcher:
  void OnChange(fuchsia::ledger::PageChange page_change,
                fuchsia::ledger::ResultState result_state,
                OnChangeCallback callback) override;

 private:
  // |modular.fuchsia::modular::Lifecycle|
  void Terminate() override;

  void List(fuchsia::ledger::PageSnapshotPtr snapshot);

  void GetKeys(fit::function<void(std::vector<Key>)> callback);

  void AddNew();

  void DeleteOne(std::vector<Key> keys);

  void Act();

  async::Loop* const loop_;
  std::default_random_engine rng_;
  std::normal_distribution<> size_distribution_;
  std::uniform_int_distribution<> delay_distribution_;
  Generator generator_;
  std::unique_ptr<component::StartupContext> context_;
  fidl::InterfacePtr<fuchsia::modular::ModuleContext> module_context_;
  fuchsia::modular::ComponentContextPtr component_context_;
  fuchsia::ledger::LedgerPtr ledger_;
  fidl::Binding<fuchsia::ledger::PageWatcher> page_watcher_binding_;
  fuchsia::ledger::PagePtr page_;

  FXL_DISALLOW_COPY_AND_ASSIGN(TodoApp);
};

}  // namespace todo

#endif  // PERIDOT_EXAMPLES_TODO_CPP_TODO_H_
