// 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
            << "}";
}

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_id != mojo::gfx::composition::kHitIdNone)
    d.Append() << "hit_id=" << value.hit_id;
  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_size=" << value.layer_size << ", 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 << "}";
}

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