// Copyright 2015 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 "mojo/services/gfx/composition/cpp/formatting.h"

#include <ostream>

namespace mojo {
namespace gfx {
namespace composition {

class Delimiter {
 public:
  Delimiter(std::ostream& os) : os_(os) {}

  std::ostream& Append() {
    if (need_comma_)
      os_ << ", ";
    else
      need_comma_ = true;
    return os_;
  }

 private:
  std::ostream& os_;
  bool need_comma_ = false;
};

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::SceneToken& value) {
  return os << "{value=" << value.value << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::SceneUpdate& value) {
  os << "{";
  Delimiter d(os);
  if (value.clear_resources) {
    d.Append() << "clear_resources=true";
  }
  if (value.clear_nodes) {
    d.Append() << "clear_nodes=true";
  }
  if (value.resources) {
    d.Append() << "resources=" << value.resources;
  }
  if (value.nodes) {
    d.Append() << "nodes=" << value.nodes;
  }
  os << "}";
  return os;
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::SceneMetadata& value) {
  return os << "{version=" << value.version
            << ", presentation_time=" << value.presentation_time << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::Resource& value) {
  os << "{";
  if (value.is_scene()) {
    os << "scene=" << value.get_scene();
  } else if (value.is_mailbox_texture()) {
    os << "mailbox_texture=" << value.get_mailbox_texture();
  } else {
    os << "???";
  }
  return os << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::SceneResource& value) {
  return os << "{scene_token=" << value.scene_token << "}";
}

std::ostream& operator<<(
    std::ostream& os,
    const mojo::gfx::composition::MailboxTextureResource& value) {
  return os << "{sync_point=" << value.sync_point << ", size=" << value.size
            << ", origin=" << &value.origin << "}";
}

std::ostream& operator<<(
    std::ostream& os,
    const mojo::gfx::composition::MailboxTextureResource::Origin* value) {
  switch (*value) {
    case mojo::gfx::composition::MailboxTextureResource::Origin::TOP_LEFT:
      return os << "TOP_LEFT";
    case mojo::gfx::composition::MailboxTextureResource::Origin::BOTTOM_LEFT:
      return os << "BOTTOM_LEFT";
    default:
      return os << "???";
  }
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::Node& value) {
  os << "{";
  Delimiter d(os);
  if (value.content_transform)
    d.Append() << "content_transform=" << value.content_transform;
  if (value.content_clip)
    d.Append() << "content_clip=" << value.content_clip;
  if (value.hit_test_behavior)
    d.Append() << "hit_test_behavior=" << value.hit_test_behavior;
  if (value.op)
    d.Append() << "op=" << value.op;
  d.Append() << "combinator=" << &value.combinator;
  if (value.child_node_ids)
    d.Append() << "child_node_ids=" << value.child_node_ids;
  return os << "}";
}

std::ostream& operator<<(
    std::ostream& os,
    const mojo::gfx::composition::Node::Combinator* value) {
  switch (*value) {
    case mojo::gfx::composition::Node::Combinator::MERGE:
      return os << "MERGE";
    case mojo::gfx::composition::Node::Combinator::PRUNE:
      return os << "PRUNE";
    case mojo::gfx::composition::Node::Combinator::FALLBACK:
      return os << "FALLBACK";
    default:
      return os << "???";
  }
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::NodeOp& value) {
  os << "{";
  if (value.is_rect()) {
    os << "rect=" << value.get_rect();
  } else if (value.is_image()) {
    os << "image=" << value.get_image();
  } else if (value.is_scene()) {
    os << "scene=" << value.get_scene();
  } else if (value.is_layer()) {
    os << "layer=" << value.get_layer();
  } else {
    os << "???";
  }
  return os << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::RectNodeOp& value) {
  return os << "{content_rect=" << value.content_rect
            << ", color=" << value.color << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::ImageNodeOp& value) {
  return os << "{content_rect=" << value.content_rect
            << ", image_rect=" << value.image_rect
            << ", image_resource_id=" << value.image_resource_id
            << ", blend=" << value.blend << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::SceneNodeOp& value) {
  return os << "{scene_resource_id=" << value.scene_resource_id
            << ", scene_version=" << value.scene_version << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::LayerNodeOp& value) {
  return os << "{layer_rect=" << value.layer_rect << ", blend=" << value.blend
            << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::Color& value) {
  return os << "{red=" << static_cast<int>(value.red)
            << ", green=" << static_cast<int>(value.green)
            << ", blue=" << static_cast<int>(value.blue)
            << ", alpha=" << static_cast<int>(value.alpha) << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::Blend& value) {
  return os << "{alpha=" << static_cast<int>(value.alpha) << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::FrameInfo& value) {
  return os << "{frame_time=" << value.frame_time
            << ", frame_interval=" << value.frame_interval
            << ", frame_deadline=" << value.frame_deadline << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::HitTestBehavior& value) {
  return os << "{visibility=" << &value.visibility << ", prune" << value.prune
            << ", hit_rect=" << value.hit_rect << "}";
}

std::ostream& operator<<(
    std::ostream& os,
    const mojo::gfx::composition::HitTestBehavior::Visibility* value) {
  switch (*value) {
    case mojo::gfx::composition::HitTestBehavior::Visibility::OPAQUE:
      return os << "OPAQUE";
    case mojo::gfx::composition::HitTestBehavior::Visibility::TRANSLUCENT:
      return os << "TRANSLUCENT";
    case mojo::gfx::composition::HitTestBehavior::Visibility::INVISIBLE:
      return os << "INVISIBLE";
    default:
      return os << "???";
  }
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::HitTestResult& value) {
  return os << "{root=" << value.root << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::Hit& value) {
  os << "{";
  if (value.is_scene()) {
    os << "scene=" << value.get_scene();
  } else if (value.is_node()) {
    os << "node=" << value.get_node();
  } else {
    os << "???";
  }
  return os << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::SceneHit& value) {
  return os << "{scene_token=" << value.scene_token
            << ", scene_version=" << value.scene_version
            << ", hits=" << value.hits << "}";
}

std::ostream& operator<<(std::ostream& os,
                         const mojo::gfx::composition::NodeHit& value) {
  return os << "{node_id=" << value.node_id << ", transform=" << value.transform
            << "}";
}

}  // namespace composition
}  // namespace gfx
}  // namespace mojo
