// Copyright 2016 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/media/framework_mojo/mojo_formatting.h"

namespace mojo {
namespace media {

template <typename T>
std::ostream& operator<<(std::ostream& os, const InterfacePtr<T>& value) {
  if (!value.is_bound()) {
    return os << "<not bound>" << std::endl;
  } else {
    return os << "<bound>" << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os,
                         const MediaSourceStreamDescriptorPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "uint32_t index: " << int(value->index) << std::endl;
  os << begl << "MediaTypePtr media_type: " << value->media_type;
  os << begl
     << "MediaTypePtr original_media_type: " << value->original_media_type;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const MediaTypePtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl
     << "MediaTypeMedium medium: " << StringFromMediaTypeMedium(value->medium)
     << std::endl;
  os << begl << "MediaTypeDetailsPtr details: " << value->details;
  os << begl << "string encoding: " << value->encoding << std::endl;
  if (value->encoding_parameters) {
    os << begl << "array<uint8>? encoding_parameters: "
       << value->encoding_parameters.size() << " bytes" << std::endl;
  } else {
    os << begl << "array<uint8>? encoding_parameters: <nullptr>" << std::endl;
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const MediaTypeSetPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl
     << "MediaTypeMedium medium: " << StringFromMediaTypeMedium(value->medium)
     << std::endl;
  os << begl << "MediaTypeSetDetailsPtr details: " << value->details;
  os << begl << "array<string> encodings: " << value->encodings;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const MediaTypeDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else if (value->has_unknown_tag()) {
    return os << "<empty>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  if (value->is_audio()) {
    return os << begl
              << "AudioMediaTypeDetailsPtr* audio: " << value->get_audio()
              << outdent;
  }
  if (value->is_video()) {
    return os << begl
              << "VideoMediaTypeDetailsPtr* video: " << value->get_video()
              << outdent;
  }
  if (value->is_text()) {
    return os << begl << "TextMediaTypeDetailsPtr* text: " << value->get_text()
              << outdent;
  }
  if (value->is_subpicture()) {
    return os << begl << "SubpictureMediaTypeDetailsPtr* video: "
              << value->get_subpicture() << outdent;
  }
  return os << begl << "UNKNOWN TAG" << std::endl << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const MediaTypeSetDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else if (value->has_unknown_tag()) {
    return os << "<empty>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  if (value->is_audio()) {
    return os << begl
              << "AudioMediaTypeSetDetailsPtr* audio: " << value->get_audio()
              << outdent;
  }
  if (value->is_video()) {
    return os << begl
              << "VideoMediaTypeSetDetailsPtr* video: " << value->get_video()
              << outdent;
  }
  if (value->is_text()) {
    return os << begl
              << "TextMediaTypeSetDetailsPtr* video: " << value->get_text()
              << outdent;
  }
  if (value->is_subpicture()) {
    return os << begl << "SubpictureMediaTypeSetDetailsPtr* video: "
              << value->get_subpicture() << outdent;
  }
  return os << begl << "UNKNOWN TAG" << std::endl << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const AudioMediaTypeDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "AudioSampleFormat sample_format: "
     << StringFromAudioSampleFormat(value->sample_format) << std::endl;
  os << begl << "uint32_t channels: " << int(value->channels) << std::endl;
  os << begl << "uint32_t frames_per_second: " << value->frames_per_second
     << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const AudioMediaTypeSetDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "AudioSampleFormat sample_format: "
     << StringFromAudioSampleFormat(value->sample_format) << std::endl;
  os << begl << "uint32_t min_channels: " << int(value->min_channels)
     << std::endl;
  os << begl << "uint32_t max_channels: " << int(value->max_channels)
     << std::endl;
  os << begl
     << "uint32_t min_frames_per_second: " << value->min_frames_per_second
     << std::endl;
  os << begl
     << "uint32_t max_cframes_per_second: " << value->max_frames_per_second
     << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const VideoMediaTypeDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "VideoProfile profile: " << value->profile << std::endl;
  os << begl << "PixelFormat pixel_format: " << value->pixel_format
     << std::endl;
  os << begl << "ColorSpace color_space: " << value->color_space << std::endl;
  os << begl << "uint32_t width: " << value->width << std::endl;
  os << begl << "uint32_t height: " << value->height << std::endl;
  os << begl << "uint32_t coded_width: " << value->coded_width << std::endl;
  os << begl << "uint32_t coded_height: " << value->coded_height << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const VideoMediaTypeSetDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "uint32_t min_width: " << value->min_width << std::endl;
  os << begl << "uint32_t max_width: " << value->max_width << std::endl;
  os << begl << "uint32_t min_height: " << value->min_height << std::endl;
  os << begl << "uint32_t max_height: " << value->max_height << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const TextMediaTypeDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const TextMediaTypeSetDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const SubpictureMediaTypeDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const SubpictureMediaTypeSetDetailsPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const TimelineQuadPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "int64 reference_offset: " << value->reference_offset
     << std::endl;
  os << begl << "int64 target_offset: " << value->target_offset << std::endl;
  os << begl << "int32 reference_delta: " << value->reference_delta
     << std::endl;
  os << begl << "uint32 target_delta: " << value->target_delta << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const TimelineTransformPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "TimelineQuad quad: " << value->quad;
  os << begl << "uint32 reference_timeline_id: " << value->reference_timeline_id
     << std::endl;
  os << begl << "uint32 target_timeline_id: " << value->target_timeline_id
     << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const HttpHeaderPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    return os << value->name << ":" << value->value << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, const URLRequestPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "mojo::String url: " << value->url << std::endl;
  os << begl << "mojo::String method: " << value->method << std::endl;
  os << begl << "mojo::Array<mojo::HttpHeaderPtr> headers: " << value->headers;
  os << begl
     << "mojo::Array<mojo::ScopedDataPipeConsumerHandle> body: " << value->body;
  os << begl << "uint32_t response_body_buffer_size: "
     << value->response_body_buffer_size << std::endl;
  os << begl << "bool auto_follow_redirects: " << value->auto_follow_redirects
     << std::endl;
  os << begl << "URLRequest::CacheMode cache_mode: " << value->cache_mode
     << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const URLResponsePtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "mojo::NetworkErrorPtr error: " << value->error;
  os << begl << "mojo::ScopedDataPipeConsumerHandle body: " << value->body
     << std::endl;
  os << begl << "mojo::String url: " << value->url << std::endl;
  os << begl << "uint32_t status_code: " << value->status_code << std::endl;
  os << begl << "mojo::String status_line: " << value->status_line << std::endl;
  os << begl << "mojo::Array<mojo::HttpHeaderPtr> headers: " << value->headers;
  os << begl << "mojo::String mime_type: " << value->mime_type << std::endl;
  os << begl << "mojo::String charset: " << value->charset << std::endl;
  os << begl << "mojo::String redirect_method: " << value->redirect_method
     << std::endl;
  os << begl << "mojo::String redirect_url: " << value->redirect_url
     << std::endl;
  os << begl << "mojo::String redirect_referrer: " << value->redirect_referrer
     << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const NetworkErrorPtr& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "int32_t code: " << value->code << std::endl;
  os << begl << "mojo::String description: " << value->description << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os,
                         const ScopedDataPipeConsumerHandle& value) {
  if (value.is_valid()) {
    return os << "<valid>";
  } else {
    return os << "<not valid>";
  }
}

const char* StringFromMediaTypeMedium(MediaTypeMedium value) {
  switch (value) {
    case MediaTypeMedium::AUDIO:
      return "AUDIO";
    case MediaTypeMedium::VIDEO:
      return "VIDEO";
    case MediaTypeMedium::TEXT:
      return "TEXT";
    case MediaTypeMedium::SUBPICTURE:
      return "SUBPICTURE";
  }
  return "UNKNOWN MEDIUM";
}

const char* StringFromAudioSampleFormat(AudioSampleFormat value) {
  switch (value) {
    case AudioSampleFormat::ANY:
      return "ANY";
    case AudioSampleFormat::UNSIGNED_8:
      return "UNSIGNED_8";
    case AudioSampleFormat::SIGNED_16:
      return "SIGNED_16";
    case AudioSampleFormat::SIGNED_24_IN_32:
      return "SIGNED_24_IN_32";
    case AudioSampleFormat::FLOAT:
      return "FLOAT";
  }
  return "UNKNOWN FORMAT";
}

const char* StringFromMediaState(MediaState value) {
  switch (value) {
    case MediaState::FAULT:
      return "FAULT";
    case MediaState::UNPREPARED:
      return "UNPREPARED";
    case MediaState::PAUSED:
      return "PAUSED";
    case MediaState::PLAYING:
      return "PLAYING";
    case MediaState::ENDED:
      return "ENDED";
  }
  return "UNKNOWN MEDIA STATE";
}

}  // namespace media
}  // namespace mojo
