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

#include "cobalt/base/polymorphic_downcast.h"
#include "cobalt/cssom/property_list_value.h"

namespace cobalt {
namespace css_parser {

void BorderShorthandToLonghand::Assign4BordersBasedOnPropertyList(
    const scoped_refptr<cssom::PropertyValue>& property_list) {
  DCHECK(property_list);
  DCHECK(property_list->GetTypeId() ==
         base::GetTypeId<cssom::PropertyListValue>());

  const cssom::PropertyListValue* list =
      base::polymorphic_downcast<cssom::PropertyListValue*>(
          property_list.get());
  switch (list->value().size()) {
    case 1: {
      // If right is missing, it is the same as top. A missing left is the same
      // as right. A missing bottom is the same as top.
      border_top = list->value()[0];
      border_right = list->value()[0];
      border_bottom = list->value()[0];
      border_left = list->value()[0];
      break;
    }
    case 2: {
      // If left is mising, it is the same as right; If bottom is missing, it is
      // the same as top.
      border_top = list->value()[0];
      border_right = list->value()[1];
      border_bottom = list->value()[0];
      border_left = list->value()[1];
      break;
    }
    case 3: {
      // A missing left is the same as right.
      border_top = list->value()[0];
      border_right = list->value()[1];
      border_bottom = list->value()[2];
      border_left = list->value()[1];
      break;
    }
    case 4: {
      border_top = list->value()[0];
      border_right = list->value()[1];
      border_bottom = list->value()[2];
      border_left = list->value()[3];
      break;
    }
    default:
      NOTREACHED();
  }
}

}  // namespace css_parser
}  // namespace cobalt
