/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <inttypes.h>

#include "base/stringprintf.h"
#include "cobalt/cssom/time_list_value.h"

namespace cobalt {
namespace cssom {

std::string TimeListValue::ToString() const {
  std::string result;
  for (size_t i = 0; i < value().size(); ++i) {
    if (!result.empty()) result.append(", ");
    int64 in_ms = value()[i].InMilliseconds();
    int64 truncated_to_seconds = in_ms / base::Time::kMillisecondsPerSecond;
    if (in_ms == base::Time::kMillisecondsPerSecond * truncated_to_seconds) {
      result.append(base::StringPrintf("%" PRIu64 "s", truncated_to_seconds));
    } else {
      result.append(base::StringPrintf("%" PRIu64 "ms", in_ms));
    }
  }
  return result;
}

}  // namespace cssom
}  // namespace cobalt
