// Copyright 2014 The Cobalt Authors. 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.

#ifndef COBALT_CSSOM_FONT_WEIGHT_VALUE_H_
#define COBALT_CSSOM_FONT_WEIGHT_VALUE_H_

#include <string>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "cobalt/base/polymorphic_equatable.h"
#include "cobalt/cssom/property_value.h"

namespace cobalt {
namespace cssom {

class PropertyValueVisitor;

// Specifies the weight of glyphs in the font, their degree of blackness
// or stroke thickness.
//   https://www.w3.org/TR/css3-fonts/#font-weight-prop
class FontWeightValue : public PropertyValue {
 public:
  enum Value {
    kThinAka100,
    kExtraLightAka200,  // same as Ultra Light
    kLightAka300,
    kNormalAka400,
    kMediumAka500,
    kSemiBoldAka600,  // same as Demi Bold
    kBoldAka700,
    kExtraBoldAka800,  // same as Ultra Bold
    kBlackAka900,      // same as Heavy
  };

  // For the sake of saving memory an explicit instantiation of this class
  // is disallowed. Use factory methods below to obtain shared instances.
  static const scoped_refptr<FontWeightValue>& GetThinAka100();
  static const scoped_refptr<FontWeightValue>& GetExtraLightAka200();
  static const scoped_refptr<FontWeightValue>& GetLightAka300();
  static const scoped_refptr<FontWeightValue>& GetNormalAka400();
  static const scoped_refptr<FontWeightValue>& GetMediumAka500();
  static const scoped_refptr<FontWeightValue>& GetSemiBoldAka600();
  static const scoped_refptr<FontWeightValue>& GetBoldAka700();
  static const scoped_refptr<FontWeightValue>& GetExtraBoldAka800();
  static const scoped_refptr<FontWeightValue>& GetBlackAka900();

  void Accept(PropertyValueVisitor* visitor) override;

  Value value() const { return value_; }

  std::string ToString() const override;

  bool operator==(const FontWeightValue& other) const {
    return value_ == other.value_;
  }

  DEFINE_POLYMORPHIC_EQUATABLE_TYPE(FontWeightValue);

  // Implementation detail, has to be public in order to be constructible.
  struct NonTrivialStaticFields;

 private:
  explicit FontWeightValue(Value value) : value_(value) {}
  ~FontWeightValue() override {}

  const Value value_;

  DISALLOW_COPY_AND_ASSIGN(FontWeightValue);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_FONT_WEIGHT_VALUE_H_
