// 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/transition_shorthand_property_parse_structures.h"

#include "cobalt/cssom/css_declared_style_data.h"

namespace cobalt {
namespace css_parser {

namespace {

// While the inital values for transition_duration, transition_timing_function
// and transition_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 transition property.
cssom::PropertyKey GetInitialProperty() {
  return base::polymorphic_downcast<const cssom::PropertyKeyListValue*>(
             cssom::GetPropertyInitialValue(cssom::kTransitionPropertyProperty)
                 .get())
      ->value()[0];
}

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

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

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

}  // namespace

void SingleTransitionShorthand::ReplaceNullWithInitialValues() {
  if (!property) {
    property = GetInitialProperty();
  }

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

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

  if (!delay) {
    delay = GetInitialDelay();
  }
}

}  // namespace css_parser
}  // namespace cobalt
