/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */
package org.apache.camel
package scala.dsl.languages

/**
 * Trait to support the different expression languages available in Camel 
 */
trait Languages {
  
  /**
   * Implicitly make a method for every language available on the Camel Exchange
   */
  implicit def addLanguageMethodsToExchange(exchange: Exchange) = new {
    def el(expression: String) =         Languages.this.el(expression)(exchange)
    def groovy(expression: String) =     Languages.this.groovy(expression)(exchange)
    def header(headerName: String) =     Languages.this.header(headerName)(exchange)
    def javascript(expression: String) = Languages.this.javascript(expression)(exchange)
    def jxpath(expression: String) =     Languages.this.jxpath(expression)(exchange)
    def mvel(expression: String) =       Languages.this.mvel(expression)(exchange)
    def ognl(expression: String) =       Languages.this.ognl(expression)(exchange)
    def php(expression: String) =        Languages.this.php(expression)(exchange)
    def property(propertyName: String) = Languages.this.property(propertyName)(exchange)
    def python(expression: String) =     Languages.this.python(expression)(exchange)
    def ruby(expression: String) =       Languages.this.ruby(expression)(exchange)
    def simple(expression: String) =     Languages.this.simple(expression)(exchange)
    def spel(expression: String) =       Languages.this.spel(expression)(exchange)
    def sql(expression: String) =        Languages.this.sql(expression)(exchange)
    def xpath(expression: String) =      Languages.this.xpath(expression)(exchange)
    def xquery(expression: String) =     Languages.this.xquery(expression)(exchange)
  }
  
  // a set of methods to allow direct use of the language as an expression
  def el(expression: String)(exchange: Exchange) =         Languages.evaluate(expression)(exchange)("el")
  def groovy(expression: String)(exchange: Exchange) =     Languages.evaluate(expression)(exchange)("groovy")
  def header(headerName: String)(exchange: Exchange) =     Languages.evaluate(headerName)(exchange)("header")
  def javascript(expression: String)(exchange: Exchange) = Languages.evaluate(expression)(exchange)("javascript")
  def jxpath(expression: String)(exchange: Exchange) =     Languages.evaluate(expression)(exchange)("jxpath")
  def mvel(expression: String)(exchange: Exchange) =       Languages.evaluate(expression)(exchange)("mvel")
  def ognl(expression: String)(exchange: Exchange) =       Languages.evaluate(expression)(exchange)("ognl")
  def php(expression: String)(exchange: Exchange) =        Languages.evaluate(expression)(exchange)("php")
  def property(propertyName: String)(exchange: Exchange) = Languages.evaluate(propertyName)(exchange)("property")
  def python(expression: String)(exchange: Exchange) =     Languages.evaluate(expression)(exchange)("python")
  def ruby(expression: String)(exchange: Exchange) =       Languages.evaluate(expression)(exchange)("ruby")
  def simple(expression: String)(exchange: Exchange) =     Languages.evaluate(expression)(exchange)("simple")
  def spel(expression: String)(exchange: Exchange) =       Languages.evaluate(expression)(exchange)("spel")
  def sql(expression: String)(exchange: Exchange) =        Languages.evaluate(expression)(exchange)("sql")
  def xpath(expression: String)(exchange: Exchange) =      Languages.evaluate(expression)(exchange)("xpath")
  def xquery(expression: String)(exchange: Exchange) =     Languages.evaluate(expression)(exchange)("xquery")
  
}

/**
 * Companion object with the static template method for language support 
 */
object Languages {

  def evaluate(expression: String)(exchange: Exchange)(lang: String) : Any = {
    val language = exchange.getContext().resolveLanguage(lang)
    language.createExpression(expression).evaluate(exchange, classOf[Object])
  }
}
