// 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/converters/array_string/array_string_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::OrderDirection::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(),
                                static_cast<int32_t>(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(mojo::EventType::UNKNOWN),
      direction(mojo::OrderDirection::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
