// Copyright 2014 The Chromium 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 SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
#define SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "mojo/public/cpp/bindings/array.h"
#include "mojo/services/geometry/interfaces/geometry.mojom.h"
#include "mojo/services/view_manager/public/cpp/types.h"
#include "mojo/services/view_manager/public/interfaces/view_manager.mojom.h"

namespace view_manager {

enum ChangeType {
  CHANGE_TYPE_EMBED,
  CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED,
  // TODO(sky): NODE->VIEW.
  CHANGE_TYPE_NODE_BOUNDS_CHANGED,
  CHANGE_TYPE_NODE_VIEWPORT_METRICS_CHANGED,
  CHANGE_TYPE_NODE_HIERARCHY_CHANGED,
  CHANGE_TYPE_NODE_REORDERED,
  CHANGE_TYPE_NODE_VISIBILITY_CHANGED,
  CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED,
  CHANGE_TYPE_NODE_DELETED,
  CHANGE_TYPE_INPUT_EVENT,
  CHANGE_TYPE_PROPERTY_CHANGED,
  CHANGE_TYPE_DELEGATE_EMBED,
};

// TODO(sky): consider nuking and converting directly to ViewData.
struct TestView {
  TestView();
  ~TestView();

  // Returns a string description of this.
  std::string ToString() const;

  // Returns a string description that includes visible and drawn.
  std::string ToString2() const;

  mojo::Id parent_id;
  mojo::Id view_id;
  bool visible;
  bool drawn;
  std::map<std::string, std::vector<uint8_t>> properties;
};

// Tracks a call to ViewManagerClient. See the individual functions for the
// fields that are used.
struct Change {
  Change();
  ~Change();

  ChangeType type;
  mojo::ConnectionSpecificId connection_id;
  std::vector<TestView> views;
  mojo::Id view_id;
  mojo::Id view_id2;
  mojo::Id view_id3;
  mojo::Rect bounds;
  mojo::Rect bounds2;
  mojo::EventType event_action;
  mojo::String creator_url;
  mojo::String embed_url;
  mojo::OrderDirection direction;
  bool bool_value;
  std::string property_key;
  std::string property_value;
};

// Converts Changes to string descriptions.
std::vector<std::string> ChangesToDescription1(
    const std::vector<Change>& changes);

// Convenience for returning the description of the first item in |changes|.
// Returns an empty string if |changes| has something other than one entry.
std::string SingleChangeToDescription(const std::vector<Change>& changes);

// Convenience for returning the description of the first item in |views|.
// Returns an empty string if |views| has something other than one entry.
std::string SingleViewDescription(const std::vector<TestView>& views);

// Returns a string description of |changes[0].views|. Returns an empty string
// if change.size() != 1.
std::string ChangeViewDescription(const std::vector<Change>& changes);

// Converts ViewDatas to TestViews.
void ViewDatasToTestViews(const mojo::Array<mojo::ViewDataPtr>& data,
                          std::vector<TestView>* test_views);

// TestChangeTracker is used to record ViewManagerClient functions. It notifies
// a delegate any time a change is added.
class TestChangeTracker {
 public:
  // Used to notify the delegate when a change is added. A change corresponds to
  // a single ViewManagerClient function.
  class Delegate {
   public:
    virtual void OnChangeAdded() = 0;

   protected:
    virtual ~Delegate() {}
  };

  TestChangeTracker();
  ~TestChangeTracker();

  void set_delegate(Delegate* delegate) {
    delegate_ = delegate;
  }

  std::vector<Change>* changes() { return &changes_; }

  // Each of these functions generate a Change. There is one per
  // ViewManagerClient function.
  void OnEmbed(mojo::ConnectionSpecificId connection_id,
               const mojo::String& creator_url,
               mojo::ViewDataPtr root);
  void OnEmbeddedAppDisconnected(mojo::Id view_id);
  void OnViewBoundsChanged(mojo::Id view_id,
                           mojo::RectPtr old_bounds,
                           mojo::RectPtr new_bounds);
  void OnViewViewportMetricsChanged(mojo::ViewportMetricsPtr old_bounds,
                                    mojo::ViewportMetricsPtr new_bounds);
  void OnViewHierarchyChanged(mojo::Id view_id,
                              mojo::Id new_parent_id,
                              mojo::Id old_parent_id,
                              mojo::Array<mojo::ViewDataPtr> views);
  void OnViewReordered(mojo::Id view_id,
                       mojo::Id relative_view_id,
                       mojo::OrderDirection direction);
  void OnViewDeleted(mojo::Id view_id);
  void OnViewVisibilityChanged(mojo::Id view_id, bool visible);
  void OnViewDrawnStateChanged(mojo::Id view_id, bool drawn);
  void OnViewInputEvent(mojo::Id view_id, mojo::EventPtr event);
  void OnViewSharedPropertyChanged(mojo::Id view_id,
                                   mojo::String name,
                                   mojo::Array<uint8_t> data);
  void DelegateEmbed(const mojo::String& url);

 private:
  void AddChange(const Change& change);

  Delegate* delegate_;
  std::vector<Change> changes_;

  DISALLOW_COPY_AND_ASSIGN(TestChangeTracker);
};

}  // namespace view_manager

#endif  // SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
