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

#include "base/lazy_instance.h"
#include "base/threading/thread_checker.h"
#include "cobalt/cssom/keyword_names.h"
#include "cobalt/cssom/property_value_visitor.h"

namespace cobalt {
namespace cssom {

struct FontStyleValue::NonTrivialStaticFields {
  NonTrivialStaticFields()
      : italic(new FontStyleValue(FontStyleValue::kItalic)),
        normal(new FontStyleValue(FontStyleValue::kNormal)),
        oblique(new FontStyleValue(FontStyleValue::kOblique)) {}

  const scoped_refptr<FontStyleValue> italic;
  const scoped_refptr<FontStyleValue> normal;
  const scoped_refptr<FontStyleValue> oblique;
};

namespace {

base::LazyInstance<FontStyleValue::NonTrivialStaticFields>
    non_trivial_static_fields = LAZY_INSTANCE_INITIALIZER;

}  // namespace

const scoped_refptr<FontStyleValue>& FontStyleValue::GetItalic() {
  return non_trivial_static_fields.Get().italic;
}

const scoped_refptr<FontStyleValue>& FontStyleValue::GetNormal() {
  return non_trivial_static_fields.Get().normal;
}

const scoped_refptr<FontStyleValue>& FontStyleValue::GetOblique() {
  return non_trivial_static_fields.Get().oblique;
}

void FontStyleValue::Accept(PropertyValueVisitor* visitor) {
  visitor->VisitFontStyle(this);
}

std::string FontStyleValue::ToString() const {
  switch (value_) {
    case kItalic:
      return kItalicKeywordName;
    case kNormal:
      return kNormalKeywordName;
    case kOblique:
      return kObliqueKeywordName;
    default:
      NOTREACHED();
      return "";
  }
}

}  // namespace cssom
}  // namespace cobalt
