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

#include "services/media/framework/formatting.h"

namespace mojo {
namespace media {

int ostream_indent_index() {
  static int i = std::ios_base::xalloc();
  return i;
}

std::ostream& begl(std::ostream& os) {
  for (long i = 0; i < os.iword(ostream_indent_index()); i++) {
    os << "    ";
  }
  return os;
}

std::ostream& operator<<(std::ostream& os, Result value) {
  switch (value) {
    case Result::kOk:
      return os << "kOk";
    case Result::kUnknownError:
      return os << "kUnknownError";
    case Result::kInternalError:
      return os << "kInternalError";
    case Result::kUnsupportedOperation:
      return os << "kUnsupportedOperation";
    case Result::kInvalidArgument:
      return os << "kInvalidArgument";
    case Result::kNotFound:
      return os << "kNotFound";
  }
  return os;
}

std::ostream& operator<<(std::ostream& os, Demand value) {
  switch (value) {
    case Demand::kNegative:
      return os << "kNegative";
    case Demand::kNeutral:
      return os << "kNeutral";
    case Demand::kPositive:
      return os << "kPositive";
  }
  return os;
}

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

  os << "&" << std::hex << uint64_t(value.get()) << std::dec;
  os << "/pts:" << value->presentation_time();
  os << "/dur:" << value->duration();
  os << "/eos:" << (value->end_of_stream() ? "t" : "f");
  os << "/size:" << value->size();
  os << "/payload:" << std::hex << uint64_t(value->payload()) << std::dec;
  return os;
}

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

  os << indent;
  os << begl << "Scheme scheme(): " << value->scheme() << std::endl;
  switch (value->scheme()) {
    case StreamType::Scheme::kMultiplexed:
      os << begl << "std::unique_ptr<StreamType> multiplex_type: "
          << value->multiplexed()->multiplex_type();
      os << begl << "std::unique_ptr<std::vector<std::unique_ptr<StreamType>>>"
          << " substream_types: "
          << value->multiplexed()->substream_types();
      break;
    case StreamType::Scheme::kLpcm:
      os << begl << "SampleFormat sample_format: "
          << value->lpcm()->sample_format() << std::endl;
      os << begl << "uint32_t channels: "
          << value->lpcm()->channels() << std::endl;
      os << begl << "uint32_t frames_per_second: "
          << value->lpcm()->frames_per_second() << std::endl;
      break;
    case StreamType::Scheme::kCompressedAudio:
      os << begl << "AudioEncoding encoding: "
          << value->compressed_audio()->encoding() << std::endl;
      os << begl << "SampleFormat sample_format: "
          << value->compressed_audio()->sample_format() << std::endl;
      os << begl << "uint32_t channels: "
          << value->compressed_audio()->channels() << std::endl;
      os << begl << "uint32_t frames_per_second: "
          << value->compressed_audio()->frames_per_second() << std::endl;
      os << begl << "std::unique_ptr<Bytes> encoding_details: "
          << value->compressed_audio()->encoding_details() << std::endl;
      break;
    case StreamType::Scheme::kVideo:
      os << begl << "VideoEncoding encoding: "
          << value->video()->encoding() << std::endl;
      os << begl << "VideoProfile profile: "
          << value->video()->profile() << std::endl;
      os << begl << "PixelFormat pixel_format: "
          << value->video()->pixel_format() << std::endl;
      os << begl << "ColorSpace color_space: "
          << value->video()->color_space() << std::endl;
      os << begl << "uint32_t width: "
          << value->video()->width() << std::endl;
      os << begl << "uint32_t height: "
          << value->video()->height() << std::endl;
      os << begl << "uint32_t coded_width: "
          << value->video()->coded_width() << std::endl;
      os << begl << "uint32_t coded_height: "
          << value->video()->coded_height() << std::endl;
      os << begl << "std::unique_ptr<Bytes> encoding_details: "
          << value->video()->encoding_details() << std::endl;
      break;
    default:
      break;
  }

  return os << outdent;
}

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

  os << indent;
  os << begl << "Scheme scheme(): " << value->scheme() << std::endl;
  switch (value->scheme()) {
    case StreamType::Scheme::kMultiplexed:
      os << begl << "std::unique_ptr<StreamTypeSet> multiplex_type_set: "
          << value->multiplexed()->multiplex_type_set();
      os << begl << "std::unique_ptr<std::vector<std::unique_ptr<"
          << "StreamTypeSet>>> substream_type_sets: "
          << value->multiplexed()->substream_type_sets();
      break;
    case StreamType::Scheme::kLpcm:
      os << begl << "SampleFormat sample_format: "
          << value->lpcm()->sample_format() << std::endl;
      os << begl << "Range<uint32_t> channels: "
          << value->lpcm()->channels() << std::endl;
      os << begl << "Range<uint32_t> frames_per_second: "
          << value->lpcm()->frames_per_second() << std::endl;
      break;
    case StreamType::Scheme::kCompressedAudio:
      os << begl << "AudioEncoding encoding: "
          << value->compressed_audio()->encoding() << std::endl;
      os << begl << "SampleFormat sample_format: "
          << value->compressed_audio()->sample_format() << std::endl;
      os << begl << "Range<uint32_t> channels: "
          << value->compressed_audio()->channels() << std::endl;
      os << begl << "Range<uint32_t> frames_per_second: "
          << value->compressed_audio()->frames_per_second() << std::endl;
      break;
    case StreamType::Scheme::kVideo:
      os << begl << "VideoEncoding encoding: "
          << value->video()->encoding() << std::endl;
      os << begl << "Range<uint32_t> width: "
          << value->video()->width() << std::endl;
      os << begl << "Range<uint32_t> height: "
          << value->video()->height() << std::endl;
      break;
    default:
      break;
  }

  return os << outdent;
}

std::ostream& operator<<(
    std::ostream& os,
    const std::unique_ptr<std::vector<std::unique_ptr<StreamType>>>& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else if (value->size() == 0) {
    return os << "<empty>" << std::endl;
  } else {
    os << std::endl;
  }

  int index = 0;
  for (const std::unique_ptr<StreamType>& element : *value) {
    os << "[" << index++ << "]: " << element;
  }

  return os;
}

std::ostream& operator<<(
    std::ostream& os,
    const std::unique_ptr<std::vector<std::unique_ptr<StreamTypeSet>>>& value) {
  if (!value) {
    return os << "<nullptr>" << std::endl;
  } else if (value->size() == 0) {
    return os << "<empty>" << std::endl;
  } else {
    os << std::endl;
  }

  int index = 0;
  for (const std::unique_ptr<StreamTypeSet>& element : *value) {
    os << "[" << index++ << "]: " << element;
  }

  return os;
}

std::ostream& operator<<(std::ostream& os, StreamType::Scheme value) {
  switch (value) {
    case StreamType::Scheme::kUnknown:
      return os << "kUnknown";
    case StreamType::Scheme::kNone:
      return os << "kNone";
    case StreamType::Scheme::kAnyElementary:
      return os << "kAnyElementary";
    case StreamType::Scheme::kAnyAudio:
      return os << "kAnyAudio";
    case StreamType::Scheme::kAnyVideo:
      return os << "kAnyVideo";
    case StreamType::Scheme::kAnySubpicture:
      return os << "kAnySubpicture";
    case StreamType::Scheme::kAnyText:
      return os << "kAnyText";
    case StreamType::Scheme::kAnyMultiplexed:
      return os << "kAnyMultiplexed";
    case StreamType::Scheme::kAny:
      return os << "kAny";
    case StreamType::Scheme::kMultiplexed:
      return os << "kMultiplexed";
    case StreamType::Scheme::kLpcm:
      return os << "kLpcm";
    case StreamType::Scheme::kCompressedAudio:
      return os << "kCompressedAudio";
    case StreamType::Scheme::kVideo:
      return os << "kVideo";
  }
  return os;
}

std::ostream& operator<<(std::ostream& os, LpcmStreamType::SampleFormat value) {
  switch (value) {
    case LpcmStreamType::SampleFormat::kUnknown:
      return os << "kUnknown";
    case LpcmStreamType::SampleFormat::kAny:
      return os << "kAny";
    case LpcmStreamType::SampleFormat::kUnsigned8:
      return os << "kUnsigned8";
    case LpcmStreamType::SampleFormat::kSigned16:
      return os << "kSigned16";
    case LpcmStreamType::SampleFormat::kSigned24In32:
      return os << "kSigned24In32";
    case LpcmStreamType::SampleFormat::kFloat:
      return os << "kFloat";
  }
  return os;
}

std::ostream& operator<<(
    std::ostream& os,
    CompressedAudioStreamType::AudioEncoding value) {
  switch (value) {
    case CompressedAudioStreamType::AudioEncoding::kUnknown:
      return os << "kUnknown";
    case CompressedAudioStreamType::AudioEncoding::kAny:
      return os << "kAny";
    case CompressedAudioStreamType::AudioEncoding::kVorbis:
      return os << "kVorbis";
  }
  return os;
}

std::ostream& operator<<(
    std::ostream& os,
    VideoStreamType::VideoEncoding value) {
  switch (value) {
    case VideoStreamType::VideoEncoding::kUnknown:
      return os << "kUnknown";
    case VideoStreamType::VideoEncoding::kAny:
      return os << "kAny";
    case VideoStreamType::VideoEncoding::kTheora:
      return os << "kTheora";
    case VideoStreamType::VideoEncoding::kVp8:
      return os << "kVp8";
  }
  return os;
}

std::ostream& operator<<(
    std::ostream& os,
    VideoStreamType::VideoProfile value) {
  switch (value) {
    case VideoStreamType::VideoProfile::kUnknown:
      return os << "kUnknown";
    case VideoStreamType::VideoProfile::kNotApplicable:
      return os << "kNotApplicable";
    case VideoStreamType::VideoProfile::kH264Baseline:
      return os << "kH264Baseline";
    case VideoStreamType::VideoProfile::kH264Main:
      return os << "kH264Main";
    case VideoStreamType::VideoProfile::kH264Extended:
      return os << "kH264Extended";
    case VideoStreamType::VideoProfile::kH264High:
      return os << "kH264High";
    case VideoStreamType::VideoProfile::kH264High10:
      return os << "kH264High10";
    case VideoStreamType::VideoProfile::kH264High422:
      return os << "kH264High422";
    case VideoStreamType::VideoProfile::kH264High444Predictive:
      return os << "kH264High444Predictive";
    case VideoStreamType::VideoProfile::kH264ScalableBaseline:
      return os << "kH264ScalableBaseline";
    case VideoStreamType::VideoProfile::kH264ScalableHigh:
      return os << "kH264ScalableHigh";
    case VideoStreamType::VideoProfile::kH264StereoHigh:
      return os << "kH264StereoHigh";
    case VideoStreamType::VideoProfile::kH264MultiviewHigh:
      return os << "kH264MultiviewHigh";
  }
  return os;
}

std::ostream& operator<<(std::ostream& os, VideoStreamType::PixelFormat value) {
  switch (value) {
    case VideoStreamType::PixelFormat::kUnknown:
      return os << "kUnknown";
    case VideoStreamType::PixelFormat::kI420:
      return os << "kI420";
    case VideoStreamType::PixelFormat::kYv12:
      return os << "kYv12";
    case VideoStreamType::PixelFormat::kYv16:
      return os << "kYv16";
    case VideoStreamType::PixelFormat::kYv12A:
      return os << "kYv12A";
    case VideoStreamType::PixelFormat::kYv24:
      return os << "kYv24";
    case VideoStreamType::PixelFormat::kNv12:
      return os << "kNv12";
    case VideoStreamType::PixelFormat::kNv21:
      return os << "kNv21";
    case VideoStreamType::PixelFormat::kUyvy:
      return os << "kUyvy";
    case VideoStreamType::PixelFormat::kYuy2:
      return os << "kYuy2";
    case VideoStreamType::PixelFormat::kArgb:
      return os << "kArgb";
    case VideoStreamType::PixelFormat::kXrgb:
      return os << "kXrgb";
    case VideoStreamType::PixelFormat::kRgb24:
      return os << "kRgb24";
    case VideoStreamType::PixelFormat::kRgb32:
      return os << "kRgb24";
    case VideoStreamType::PixelFormat::kMjpeg:
      return os << "kRgb24";
    case VideoStreamType::PixelFormat::kMt21:
      return os << "kRgb24";
  }
  return os;
}

std::ostream& operator<<(std::ostream& os, VideoStreamType::ColorSpace value) {
  switch (value) {
    case VideoStreamType::ColorSpace::kUnknown:
      return os << "kUnknown";
    case VideoStreamType::ColorSpace::kNotApplicable:
      return os << "kNotApplicable";
    case VideoStreamType::ColorSpace::kJpeg:
      return os << "kJpeg";
    case VideoStreamType::ColorSpace::kHdRec709:
      return os << "kHdRec709";
    case VideoStreamType::ColorSpace::kSdRec601:
      return os << "kSdRec601";
  }
  return os;
}

std::ostream& operator<<(
    std::ostream& os,
    const std::unique_ptr<Bytes>& value) {
  if (value == nullptr) {
    return os << "<nullptr>";
  } else {
    return os << value->size() << " bytes";
  }
}

std::ostream& operator<<(std::ostream& os, Range<bool> value) {
  if (value.min) {
    return os << "true";
  } else if (value.max) {
    return os << "false..true";
  }  else {
    return os << "false";
  }
}

} // namespace media
} // namespace mojo
