// 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.

#ifndef COBALT_CSSOM_MEDIA_FEATURE_H_
#define COBALT_CSSOM_MEDIA_FEATURE_H_

#include <vector>

#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "cobalt/cssom/media_feature_names.h"
#include "cobalt/math/size.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace cssom {

class PropertyValue;

enum MediaFeatureOperator {
  kNonZero,
  kEquals,
  kMinimum,
  kMaximum,
};

// A media feature is a '(keyword:value)' block of a @media conditional rule
// segment.
//   https://www.w3.org/TR/css3-mediaqueries/#media1
class MediaFeature : public script::Wrappable {
 public:
  explicit MediaFeature(int name);
  MediaFeature(int name, const scoped_refptr<PropertyValue>& value);

  DEFINE_WRAPPABLE_TYPE(MediaFeature);

  void set_operator(MediaFeatureOperator value) { operator_ = value; }

  // When given the media values for width and height, returns true if the media
  // query expression is true.
  bool EvaluateConditionValue(const math::Size& viewport_size);

 private:
  // The 'aspect-ratio' media feature is defined as the ratio of the value of
  // the 'width' media feature to the value of the 'height' media feature.
  //   https://www.w3.org/TR/css3-mediaqueries/#aspect-ratio
  // Returns true if the media query expression for aspect ratio is true for the
  // given media values.
  bool CompareAspectRatio(const math::Size& viewport_size);

  // Returns true if the media query expression for an integer value is true for
  // the given media value.
  bool CompareIntegerValue(int value);

  // Returns true if the media query expression for a length value is true for
  // the given media value.
  bool CompareLengthValue(int length_in_pixels);

  // The 'orientation' media feature is 'portrait' when the value of the
  // 'height' media feature is greater than or equal to the value of the 'width'
  // media feature. Otherwise 'orientation' is 'landscape'.
  //   https://www.w3.org/TR/css3-mediaqueries/#orientation
  bool CompareOrientation(const math::Size& viewport_size);

  // The 'resolution' media feature describes the resolution of the output
  // device, i.e. the density of the pixels.
  //   https://www.w3.org/TR/css3-mediaqueries/#resolution
  bool CompareResolution(const math::Size& viewport_size);

  // The 'scan' media feature describes the scanning process of "tv" output
  // devices.
  //   https://www.w3.org/TR/css3-mediaqueries/#scan
  bool CompareScan();

  MediaFeatureName name_;
  scoped_refptr<PropertyValue> value_;
  MediaFeatureOperator operator_;

  DISALLOW_COPY_AND_ASSIGN(MediaFeature);
};

typedef std::vector<scoped_refptr<MediaFeature> > MediaFeatures;

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_MEDIA_FEATURE_H_
