// Copyright 2014 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_weight_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 FontWeightValue::NonTrivialStaticFields {
  NonTrivialStaticFields()
      : thin_aka_100(new FontWeightValue(FontWeightValue::kThinAka100)),
        extra_light_aka_200(
            new FontWeightValue(FontWeightValue::kExtraLightAka200)),
        light_aka_300(new FontWeightValue(FontWeightValue::kLightAka300)),
        normal_aka_400(new FontWeightValue(FontWeightValue::kNormalAka400)),
        medium_aka_500(new FontWeightValue(FontWeightValue::kMediumAka500)),
        semi_bold_aka_600(
            new FontWeightValue(FontWeightValue::kSemiBoldAka600)),
        bold_aka_700(new FontWeightValue(FontWeightValue::kBoldAka700)),
        extra_bold_aka_800(
            new FontWeightValue(FontWeightValue::kExtraBoldAka800)),
        black_aka_900(new FontWeightValue(FontWeightValue::kBlackAka900)) {}

  const scoped_refptr<FontWeightValue> thin_aka_100;
  const scoped_refptr<FontWeightValue> extra_light_aka_200;
  const scoped_refptr<FontWeightValue> light_aka_300;
  const scoped_refptr<FontWeightValue> normal_aka_400;
  const scoped_refptr<FontWeightValue> medium_aka_500;
  const scoped_refptr<FontWeightValue> semi_bold_aka_600;
  const scoped_refptr<FontWeightValue> bold_aka_700;
  const scoped_refptr<FontWeightValue> extra_bold_aka_800;
  const scoped_refptr<FontWeightValue> black_aka_900;
};

namespace {

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

}  // namespace

const scoped_refptr<FontWeightValue>& FontWeightValue::GetThinAka100() {
  return non_trivial_static_fields.Get().thin_aka_100;
}

const scoped_refptr<FontWeightValue>& FontWeightValue::GetExtraLightAka200() {
  return non_trivial_static_fields.Get().extra_light_aka_200;
}

const scoped_refptr<FontWeightValue>& FontWeightValue::GetLightAka300() {
  return non_trivial_static_fields.Get().light_aka_300;
}

const scoped_refptr<FontWeightValue>& FontWeightValue::GetNormalAka400() {
  return non_trivial_static_fields.Get().normal_aka_400;
}

const scoped_refptr<FontWeightValue>& FontWeightValue::GetMediumAka500() {
  return non_trivial_static_fields.Get().medium_aka_500;
}

const scoped_refptr<FontWeightValue>& FontWeightValue::GetSemiBoldAka600() {
  return non_trivial_static_fields.Get().semi_bold_aka_600;
}

const scoped_refptr<FontWeightValue>& FontWeightValue::GetBoldAka700() {
  return non_trivial_static_fields.Get().bold_aka_700;
}

const scoped_refptr<FontWeightValue>& FontWeightValue::GetExtraBoldAka800() {
  return non_trivial_static_fields.Get().extra_bold_aka_800;
}

const scoped_refptr<FontWeightValue>& FontWeightValue::GetBlackAka900() {
  return non_trivial_static_fields.Get().black_aka_900;
}

void FontWeightValue::Accept(PropertyValueVisitor* visitor) {
  visitor->VisitFontWeight(this);
}

std::string FontWeightValue::ToString() const {
  switch (value_) {
    case kNormalAka400:
      return kNormalKeywordName;
    case kBoldAka700:
      return kBoldKeywordName;
    case kThinAka100:
    case kExtraLightAka200:
    case kLightAka300:
    case kMediumAka500:
    case kSemiBoldAka600:
    case kExtraBoldAka800:
    case kBlackAka900:
    default:
      // These values are not implemented by the scanner/parser.
      NOTIMPLEMENTED();
      return "";
  }
}

}  // namespace cssom
}  // namespace cobalt
