// 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 "cobalt/media/base/text_ranges.h"

#include <algorithm>
#include <utility>

#include "base/logging.h"

namespace cobalt {
namespace media {

TextRanges::TextRanges() { Reset(); }

TextRanges::~TextRanges() {}

void TextRanges::Reset() { curr_range_itr_ = range_map_.end(); }

bool TextRanges::AddCue(base::TimeDelta start_time) {
  typedef RangeMap::iterator Itr;

  if (curr_range_itr_ == range_map_.end()) {
    // There is no active time range, so this is the first AddCue()
    // attempt that follows a Reset().

    if (range_map_.empty()) {
      NewRange(start_time);
      return true;
    }

    if (start_time < range_map_.begin()->first) {
      NewRange(start_time);
      return true;
    }

    const Itr itr = --Itr(range_map_.upper_bound(start_time));
    DCHECK(start_time >= itr->first);

    Range& range = itr->second;

    if (start_time > range.last_time()) {
      NewRange(start_time);
      return true;
    }

    range.ResetCount(start_time);
    curr_range_itr_ = itr;
    return false;
  }

  DCHECK(start_time >= curr_range_itr_->first);

  Range& curr_range = curr_range_itr_->second;

  if (start_time <= curr_range.last_time())
    return curr_range.AddCue(start_time);

  const Itr next_range_itr = ++Itr(curr_range_itr_);

  if (next_range_itr != range_map_.end()) {
    DCHECK(next_range_itr->first > curr_range.last_time());
    DCHECK(start_time <= next_range_itr->first);

    if (start_time == next_range_itr->first) {
      // We have walked off the current range, and onto the next one.
      // There is now no ambiguity about where the current time range
      // ends, and so we coalesce the current and next ranges.

      Merge(next_range_itr, &curr_range);
      return false;
    }
  }

  // Either |curr_range| is the last range in the map, or there is a
  // next range beyond |curr_range|, but its start time is ahead of
  // this cue's start time.  In either case, this cue becomes the new
  // last_time for |curr_range|.  Eventually we will see a cue whose
  // time matches the start time of the next range, in which case we
  // coalesce the current and next ranges.

  curr_range.SetLastTime(start_time);
  return true;
}

size_t TextRanges::RangeCountForTesting() const { return range_map_.size(); }

void TextRanges::NewRange(base::TimeDelta start_time) {
  Range range;
  range.SetLastTime(start_time);

  std::pair<RangeMap::iterator, bool> result =
      range_map_.insert(std::make_pair(start_time, range));
  DCHECK(result.second);

  curr_range_itr_ = result.first;
}

void TextRanges::Merge(const RangeMap::iterator& next_range_itr,
                       Range* curr_range) {
  DCHECK(curr_range);
  *curr_range = next_range_itr->second;
  curr_range->ResetCount(next_range_itr->first);
  range_map_.erase(next_range_itr);
}

void TextRanges::Range::ResetCount(base::TimeDelta start_time) {
  count_ = (start_time < last_time_) ? 0 : 1;
}

void TextRanges::Range::SetLastTime(base::TimeDelta last_time) {
  last_time_ = last_time;
  count_ = 1;
  max_count_ = 1;
}

bool TextRanges::Range::AddCue(base::TimeDelta start_time) {
  if (start_time < last_time_) {
    DCHECK_EQ(count_, 0);
    return false;
  }

  DCHECK(start_time == last_time_);

  ++count_;
  if (count_ <= max_count_) return false;

  ++max_count_;
  return true;
}

base::TimeDelta TextRanges::Range::last_time() const { return last_time_; }

}  // namespace media
}  // namespace cobalt
