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

#include "cobalt/cssom/media_query.h"

#include "base/memory/ref_counted.h"
#include "cobalt/cssom/media_feature.h"

namespace cobalt {
namespace cssom {

// If the media query list is empty (i.e. the declaration is the empty string or
// consists solely of whitespace) it evaluates to true.
//   https://www.w3.org/TR/css3-mediaqueries/#error-handling
MediaQuery::MediaQuery() : evaluated_media_type_(true) {}

MediaQuery::MediaQuery(bool evaluated_media_type)
    : evaluated_media_type_(evaluated_media_type) {}

MediaQuery::MediaQuery(bool evaluated_media_type,
                       scoped_ptr<MediaFeatures> media_features)
    : evaluated_media_type_(evaluated_media_type),
      media_features_(media_features.release()) {}

std::string MediaQuery::media_query() {
  // TODO: Implement serialization of MediaQuery.
  NOTIMPLEMENTED() << "Serialization of MediaQuery not implemented yet.";
  return "";
}

bool MediaQuery::EvaluateConditionValue(const math::Size& viewport_size) {
  if (!evaluated_media_type_) {
    return false;
  }
  if (media_features_) {
    for (MediaFeatures::iterator it = media_features_->begin();
         it != media_features_->end(); ++it) {
      if (!(*it)->EvaluateConditionValue(viewport_size)) {
        return false;
      }
    }
  }
  return true;
}

}  // namespace cssom
}  // namespace cobalt
