/*
 * 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_
