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

#ifndef COBALT_CSS_PARSER_ANIMATION_SHORTHAND_PROPERTY_PARSE_STRUCTURES_H_
#define COBALT_CSS_PARSER_ANIMATION_SHORTHAND_PROPERTY_PARSE_STRUCTURES_H_

#include "base/optional.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/cssom/property_list_value.h"
#include "cobalt/cssom/time_list_value.h"
#include "cobalt/cssom/timing_function_list_value.h"

namespace cobalt {
namespace css_parser {

// This file contains a collection of structures used as synthetic values for
// different parser reductions related to the 'animation' shorthand property.

// The SingleAnimation structure is the type used for the result of the
// single_animation parser reduction.
struct SingleAnimationShorthand {
  SingleAnimationShorthand() : error(false) {}

  void ReplaceNullWithInitialValues();

  base::optional<base::TimeDelta> delay;
  scoped_refptr<cssom::PropertyValue> direction;
  base::optional<base::TimeDelta> duration;
  scoped_refptr<cssom::PropertyValue> fill_mode;
  scoped_refptr<cssom::PropertyValue> iteration_count;
  scoped_refptr<cssom::PropertyValue> name;
  scoped_refptr<cssom::TimingFunction> timing_function;

  bool error;
};

// As we are parsing a animation, maintain builders for all of its components.
struct AnimationShorthandBuilder {
  AnimationShorthandBuilder()
      : delay_list_builder(new cssom::TimeListValue::Builder()),
        direction_list_builder(new cssom::PropertyListValue::Builder()),
        duration_list_builder(new cssom::TimeListValue::Builder()),
        fill_mode_list_builder(new cssom::PropertyListValue::Builder()),
        iteration_count_list_builder(new cssom::PropertyListValue::Builder()),
        name_list_builder(new cssom::PropertyListValue::Builder()),
        timing_function_list_builder(
            new cssom::TimingFunctionListValue::Builder()) {}

  // The AnimationShorthandBuilder is a struct-of-arrays, so the animation
  // builder is empty if any of its sub-builder arrays are empty.
  bool empty() const { return delay_list_builder->empty(); }

  scoped_ptr<cssom::TimeListValue::Builder> delay_list_builder;
  scoped_ptr<cssom::PropertyListValue::Builder> direction_list_builder;
  scoped_ptr<cssom::TimeListValue::Builder> duration_list_builder;
  scoped_ptr<cssom::PropertyListValue::Builder> fill_mode_list_builder;
  scoped_ptr<cssom::PropertyListValue::Builder> iteration_count_list_builder;
  scoped_ptr<cssom::PropertyListValue::Builder> name_list_builder;
  scoped_ptr<cssom::TimingFunctionListValue::Builder>
      timing_function_list_builder;
};

struct AnimationShorthand {
  scoped_refptr<cssom::PropertyValue> delay_list;
  scoped_refptr<cssom::PropertyValue> direction_list;
  scoped_refptr<cssom::PropertyValue> duration_list;
  scoped_refptr<cssom::PropertyValue> fill_mode_list;
  scoped_refptr<cssom::PropertyValue> iteration_count_list;
  scoped_refptr<cssom::PropertyValue> name_list;
  scoped_refptr<cssom::PropertyValue> timing_function_list;
};

}  // namespace css_parser
}  // namespace cobalt

#endif  // COBALT_CSS_PARSER_ANIMATION_SHORTHAND_PROPERTY_PARSE_STRUCTURES_H_
