// Copyright 2015 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_MEDIA_QUERY_H_
#define COBALT_CSSOM_MEDIA_QUERY_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "cobalt/cssom/media_feature.h"
#include "cobalt/math/size.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace cssom {

// The media query represents the expression of the @media conditional rule
// for example: 'screen and (max-width: 640px) and (aspect-ratio: 4/3)'
//   https://www.w3.org/TR/css3-mediaqueries
class MediaQuery : public script::Wrappable {
 public:
  MediaQuery();
  explicit MediaQuery(bool evaluated_media_type);
  MediaQuery(bool evaluated_media_type,
             scoped_ptr<MediaFeatures> media_features);

  // Custom, not in any spec.
  //
  std::string media_query();

  bool EvaluateConditionValue(const math::Size& viewport_size);

  DEFINE_WRAPPABLE_TYPE(MediaQuery);

 private:
  bool evaluated_media_type_;
  scoped_ptr<MediaFeatures> media_features_;

  DISALLOW_COPY_AND_ASSIGN(MediaQuery);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_MEDIA_QUERY_H_
