// 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.

#include "services/view_manager/test_change_tracker.h"

#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "mojo/common/common_type_converters.h"
#include "mojo/services/view_manager/public/cpp/util.h"

using mojo::Array;
using mojo::Id;
using mojo::ViewDataPtr;
using mojo::String;

namespace view_manager {

std::string ViewIdToString(Id id) {
  return (id == 0) ? "null" : base::StringPrintf("%d,%d", mojo::HiWord(id),
                                                 mojo::LoWord(id));
}

namespace {

std::string RectToString(const mojo::Rect& rect) {
  return base::StringPrintf("%d,%d %dx%d", rect.x, rect.y, rect.width,
                            rect.height);
}

std::string DirectionToString(mojo::OrderDirection direction) {
  return direction == mojo::ORDER_DIRECTION_ABOVE ? "above" : "below";
}

std::string ChangeToDescription1(const Change& change) {
  switch (change.type) {
    case CHANGE_TYPE_EMBED:
      return base::StringPrintf("OnEmbed creator=%s",
                                change.creator_url.data());

    case CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED:
      return base::StringPrintf("OnEmbeddedAppDisconnected view=%s",
                                ViewIdToString(change.view_id).c_str());

    case CHANGE_TYPE_NODE_BOUNDS_CHANGED:
      return base::StringPrintf(
          "BoundsChanged view=%s old_bounds=%s new_bounds=%s",
          ViewIdToString(change.view_id).c_str(),
          RectToString(change.bounds).c_str(),
          RectToString(change.bounds2).c_str());

    case CHANGE_TYPE_NODE_VIEWPORT_METRICS_CHANGED:
      // TODO(sky): Not implemented.
      return "ViewportMetricsChanged";

    case CHANGE_TYPE_NODE_HIERARCHY_CHANGED:
      return base::StringPrintf(
          "HierarchyChanged view=%s new_parent=%s old_parent=%s",
          ViewIdToString(change.view_id).c_str(),
          ViewIdToString(change.view_id2).c_str(),
          ViewIdToString(change.view_id3).c_str());

    case CHANGE_TYPE_NODE_REORDERED:
      return base::StringPrintf("Reordered view=%s relative=%s direction=%s",
                                ViewIdToString(change.view_id).c_str(),
                                ViewIdToString(change.view_id2).c_str(),
                                DirectionToString(change.direction).c_str());

    case CHANGE_TYPE_NODE_DELETED:
      return base::StringPrintf("ViewDeleted view=%s",
                                ViewIdToString(change.view_id).c_str());

    case CHANGE_TYPE_NODE_VISIBILITY_CHANGED:
      return base::StringPrintf("VisibilityChanged view=%s visible=%s",
                                ViewIdToString(change.view_id).c_str(),
                                change.bool_value ? "true" : "false");

    case CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED:
      return base::StringPrintf("DrawnStateChanged view=%s drawn=%s",
                                ViewIdToString(change.view_id).c_str(),
                                change.bool_value ? "true" : "false");

    case CHANGE_TYPE_INPUT_EVENT:
      return base::StringPrintf("InputEvent view=%s event_action=%d",
                                ViewIdToString(change.view_id).c_str(),
                                change.event_action);

    case CHANGE_TYPE_PROPERTY_CHANGED:
      return base::StringPrintf("PropertyChanged view=%s key=%s value=%s",
                                ViewIdToString(change.view_id).c_str(),
                                change.property_key.c_str(),
                                change.property_value.c_str());

    case CHANGE_TYPE_DELEGATE_EMBED:
      return base::StringPrintf("DelegateEmbed url=%s",
                                change.embed_url.data());
  }
  return std::string();
}

}  // namespace

std::vector<std::string> ChangesToDescription1(
    const std::vector<Change>& changes) {
  std::vector<std::string> strings(changes.size());
  for (size_t i = 0; i < changes.size(); ++i)
    strings[i] = ChangeToDescription1(changes[i]);
  return strings;
}

std::string SingleChangeToDescription(const std::vector<Change>& changes) {
  if (changes.size() != 1u)
    return std::string();
  return ChangeToDescription1(changes[0]);
}

std::string SingleViewDescription(const std::vector<TestView>& views) {
  if (views.size() != 1u)
    return std::string();
  return views[0].ToString();
}

std::string ChangeViewDescription(const std::vector<Change>& changes) {
  if (changes.size() != 1)
    return std::string();
  std::vector<std::string> view_strings(changes[0].views.size());
  for (size_t i = 0; i < changes[0].views.size(); ++i)
    view_strings[i] = "[" + changes[0].views[i].ToString() + "]";
  return JoinString(view_strings, ',');
}

TestView ViewDataToTestView(const ViewDataPtr& data) {
  TestView view;
  view.parent_id = data->parent_id;
  view.view_id = data->view_id;
  view.visible = data->visible;
  view.drawn = data->drawn;
  view.properties =
      data->properties.To<std::map<std::string, std::vector<uint8_t>>>();
  return view;
}

void ViewDatasToTestViews(const Array<ViewDataPtr>& data,
                          std::vector<TestView>* test_views) {
  for (size_t i = 0; i < data.size(); ++i)
    test_views->push_back(ViewDataToTestView(data[i]));
}

Change::Change()
    : type(CHANGE_TYPE_EMBED),
      connection_id(0),
      view_id(0),
      view_id2(0),
      view_id3(0),
      event_action(0),
      direction(mojo::ORDER_DIRECTION_ABOVE),
      bool_value(false) {
}

Change::~Change() {
}

TestChangeTracker::TestChangeTracker()
    : delegate_(NULL) {
}

TestChangeTracker::~TestChangeTracker() {
}

void TestChangeTracker::OnEmbed(mojo::ConnectionSpecificId connection_id,
                                const String& creator_url,
                                ViewDataPtr root) {
  Change change;
  change.type = CHANGE_TYPE_EMBED;
  change.connection_id = connection_id;
  change.creator_url = creator_url;
  change.views.push_back(ViewDataToTestView(root));
  AddChange(change);
}

void TestChangeTracker::OnEmbeddedAppDisconnected(Id view_id) {
  Change change;
  change.type = CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED;
  change.view_id = view_id;
  AddChange(change);
}

void TestChangeTracker::OnViewBoundsChanged(Id view_id,
                                            mojo::RectPtr old_bounds,
                                            mojo::RectPtr new_bounds) {
  Change change;
  change.type = CHANGE_TYPE_NODE_BOUNDS_CHANGED;
  change.view_id = view_id;
  change.bounds.x = old_bounds->x;
  change.bounds.y = old_bounds->y;
  change.bounds.width = old_bounds->width;
  change.bounds.height = old_bounds->height;
  change.bounds2.x = new_bounds->x;
  change.bounds2.y = new_bounds->y;
  change.bounds2.width = new_bounds->width;
  change.bounds2.height = new_bounds->height;
  AddChange(change);
}

void TestChangeTracker::OnViewViewportMetricsChanged(
    mojo::ViewportMetricsPtr old_metrics,
    mojo::ViewportMetricsPtr new_metrics) {
  Change change;
  change.type = CHANGE_TYPE_NODE_VIEWPORT_METRICS_CHANGED;
  // NOT IMPLEMENTED
  AddChange(change);
}

void TestChangeTracker::OnViewHierarchyChanged(Id view_id,
                                               Id new_parent_id,
                                               Id old_parent_id,
                                               Array<ViewDataPtr> views) {
  Change change;
  change.type = CHANGE_TYPE_NODE_HIERARCHY_CHANGED;
  change.view_id = view_id;
  change.view_id2 = new_parent_id;
  change.view_id3 = old_parent_id;
  ViewDatasToTestViews(views, &change.views);
  AddChange(change);
}

void TestChangeTracker::OnViewReordered(Id view_id,
                                        Id relative_view_id,
                                        mojo::OrderDirection direction) {
  Change change;
  change.type = CHANGE_TYPE_NODE_REORDERED;
  change.view_id = view_id;
  change.view_id2 = relative_view_id;
  change.direction = direction;
  AddChange(change);
}

void TestChangeTracker::OnViewDeleted(Id view_id) {
  Change change;
  change.type = CHANGE_TYPE_NODE_DELETED;
  change.view_id = view_id;
  AddChange(change);
}

void TestChangeTracker::OnViewVisibilityChanged(Id view_id, bool visible) {
  Change change;
  change.type = CHANGE_TYPE_NODE_VISIBILITY_CHANGED;
  change.view_id = view_id;
  change.bool_value = visible;
  AddChange(change);
}

void TestChangeTracker::OnViewDrawnStateChanged(Id view_id, bool drawn) {
  Change change;
  change.type = CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED;
  change.view_id = view_id;
  change.bool_value = drawn;
  AddChange(change);
}

void TestChangeTracker::OnViewInputEvent(Id view_id, mojo::EventPtr event) {
  Change change;
  change.type = CHANGE_TYPE_INPUT_EVENT;
  change.view_id = view_id;
  change.event_action = event->action;
  AddChange(change);
}

void TestChangeTracker::OnViewSharedPropertyChanged(Id view_id,
                                                    String name,
                                                    Array<uint8_t> data) {
  Change change;
  change.type = CHANGE_TYPE_PROPERTY_CHANGED;
  change.view_id = view_id;
  change.property_key = name;
  if (data.is_null())
    change.property_value = "NULL";
  else
    change.property_value = data.To<std::string>();
  AddChange(change);
}

void TestChangeTracker::DelegateEmbed(const String& url) {
  Change change;
  change.type = CHANGE_TYPE_DELEGATE_EMBED;
  change.embed_url = url;
  AddChange(change);
}

void TestChangeTracker::AddChange(const Change& change) {
  changes_.push_back(change);
  if (delegate_)
    delegate_->OnChangeAdded();
}

TestView::TestView() {}

TestView::~TestView() {}

std::string TestView::ToString() const {
  return base::StringPrintf("view=%s parent=%s",
                            ViewIdToString(view_id).c_str(),
                            ViewIdToString(parent_id).c_str());
}

std::string TestView::ToString2() const {
  return base::StringPrintf("view=%s parent=%s visible=%s drawn=%s",
                            ViewIdToString(view_id).c_str(),
                            ViewIdToString(parent_id).c_str(),
                            visible ? "true" : "false",
                            drawn ? "true" : "false");
}

}  // namespace view_manager
