// 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 "cobalt/css_parser/animation_shorthand_property_parse_structures.h"

#include "cobalt/cssom/css_declared_style_data.h"

namespace cobalt {
namespace css_parser {

namespace {

// While the inital values for animation_duration, animation_timing_function
// and animation_delay are well defined, they are lists of single objects,
// and right here what we really need are those single objects.  These wrapper
// functions extract the single element out of the initial list values for
// each different optional animation property.
base::TimeDelta GetInitialDelay() {
  return base::polymorphic_downcast<const cssom::TimeListValue*>(
             cssom::GetPropertyInitialValue(cssom::kAnimationDelayProperty)
                 .get())
      ->value()[0];
}

scoped_refptr<cssom::PropertyValue> GetInitialDirection() {
  return base::polymorphic_downcast<const cssom::PropertyListValue*>(
             cssom::GetPropertyInitialValue(cssom::kAnimationDirectionProperty)
                 .get())
      ->value()[0];
}

base::TimeDelta GetInitialDuration() {
  return base::polymorphic_downcast<const cssom::TimeListValue*>(
             cssom::GetPropertyInitialValue(cssom::kAnimationDurationProperty)
                 .get())
      ->value()[0];
}

scoped_refptr<cssom::PropertyValue> GetInitialFillMode() {
  return base::polymorphic_downcast<const cssom::PropertyListValue*>(
             cssom::GetPropertyInitialValue(cssom::kAnimationFillModeProperty)
                 .get())
      ->value()[0];
}

scoped_refptr<cssom::PropertyValue> GetInitialIterationCount() {
  return base::polymorphic_downcast<const cssom::PropertyListValue*>(
             cssom::GetPropertyInitialValue(
                 cssom::kAnimationIterationCountProperty)
                 .get())
      ->value()[0];
}

scoped_refptr<cssom::PropertyValue> GetInitialName() {
  return base::polymorphic_downcast<const cssom::PropertyListValue*>(
             cssom::GetPropertyInitialValue(cssom::kAnimationFillModeProperty)
                 .get())
      ->value()[0];
}

scoped_refptr<cssom::TimingFunction> GetInitialTimingFunction() {
  return base::polymorphic_downcast<const cssom::TimingFunctionListValue*>(
             cssom::GetPropertyInitialValue(
                 cssom::kAnimationTimingFunctionProperty)
                 .get())
      ->value()[0];
}

}  // namespace

void SingleAnimationShorthand::ReplaceNullWithInitialValues() {
  if (!delay) {
    delay = GetInitialDelay();
  }

  if (!direction) {
    direction = GetInitialDirection();
  }

  if (!duration) {
    duration = GetInitialDuration();
  }

  if (!fill_mode) {
    fill_mode = GetInitialFillMode();
  }

  if (!iteration_count) {
    iteration_count = GetInitialIterationCount();
  }

  if (!name) {
    name = GetInitialName();
  }

  if (!timing_function) {
    timing_function = GetInitialTimingFunction();
  }
}

}  // namespace css_parser
}  // namespace cobalt
