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

#include "cobalt/cssom/keyword_names.h"
#include "cobalt/cssom/property_value_visitor.h"

namespace cobalt {
namespace cssom {

void ShadowValue::Accept(PropertyValueVisitor* visitor) {
  visitor->VisitShadow(this);
}

std::string ShadowValue::ToString() const {
  std::string result;
  for (size_t i = 0; i < kMaxLengths; ++i) {
    if (lengths_[i]) {
      if (!result.empty()) result.push_back(' ');
      result.append(lengths_[i]->ToString());
    }
  }

  if (color_) {
    if (!result.empty()) result.push_back(' ');
    result.append(color_->ToString());
  }

  if (has_inset_) {
    if (!result.empty()) result.push_back(' ');
    result.append(kInsetKeywordName);
  }

  return result;
}

bool ShadowValue::operator==(const ShadowValue& other) const {
  for (int i = 0; i < kMaxLengths; ++i) {
    if (!lengths_[i] != !other.lengths_[i]) {
      return false;
    }
    if (lengths_[i] && !(lengths_[i] == other.lengths_[i])) {
      return false;
    }
  }

  return color_ == other.color_ && has_inset_ == other.has_inset_;
}

}  // namespace cssom
}  // namespace cobalt
