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

#include "cobalt/cssom/keyword_value.h"

namespace cobalt {
namespace css_parser {

void BackgroundShorthandLayer::ReplaceNullWithInitialValues() {
  if (!background_color) {
    background_color =
        cssom::GetPropertyInitialValue(cssom::kBackgroundColorProperty);
  }

  if (!background_image) {
    background_image =
        cssom::GetPropertyInitialValue(cssom::kBackgroundImageProperty);
  }

  if (!background_position) {
    background_position =
        cssom::GetPropertyInitialValue(cssom::kBackgroundPositionProperty);
  }

  if (!background_repeat) {
    background_repeat =
        cssom::GetPropertyInitialValue(cssom::kBackgroundRepeatProperty);
  }

  if (!background_size) {
    background_size =
        cssom::GetPropertyInitialValue(cssom::kBackgroundSizeProperty);
  }
}

bool BackgroundShorthandLayer::IsBackgroundPropertyOverlapped(
    const BackgroundShorthandLayer& that) const {
  if (that.background_color && background_color) {
    return true;
  }

  if (that.background_image && background_image) {
    return true;
  }

  if (that.background_position && background_position) {
    return true;
  }

  if (that.background_repeat && background_repeat) {
    return true;
  }

  if (that.background_size && background_size) {
    return true;
  }

  return false;
}

void BackgroundShorthandLayer::IntegrateNonOverlapped(
    const BackgroundShorthandLayer& that) {
  DCHECK(!IsBackgroundPropertyOverlapped(that));

  if (that.background_color) {
    background_color = that.background_color;
  }

  if (that.background_image) {
    background_image = that.background_image;
  }

  if (that.background_position) {
    background_position = that.background_position;
  }

  if (that.background_repeat) {
    background_repeat = that.background_repeat;
  }

  if (that.background_size) {
    background_size = that.background_size;
  }
}

}  // namespace css_parser
}  // namespace cobalt
