/*
 * 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.olingo.server.api.uri.queryoption.expression;

import org.apache.olingo.commons.api.edm.EdmEnumType;
import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.server.api.ODataApplicationException;
import org.apache.olingo.server.api.uri.UriInfoResource;

import java.util.List;

/**
 * Generic interface to define expression visitors with arbitrary return types.
 * 
 * @param <T> Return type
 */
public interface ExpressionVisitor<T> {

  /**
   * Called for each traversed {@link Binary} expression
   * @param operator Operator kind
   * @param left Application return value of left sub tree
   * @param right Application return value of right sub tree
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occured
   * @throws ODataApplicationException Thrown by the application
   */
  T visitBinaryOperator(BinaryOperatorKind operator, T left, T right)
      throws ExpressionVisitException, ODataApplicationException;

  /**
   * Called for each traversed {@link Unary} expression
   * @param operator Operator kind
   * @param operand  return value of sub tree
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occured
   * @throws ODataApplicationException Thrown by the application
   */
  T visitUnaryOperator(UnaryOperatorKind operator, T operand)
      throws ExpressionVisitException, ODataApplicationException;

  /**
   * Called for each traversed {@link Method} expression
   * @param methodCall Method
   * @param parameters List of application return values created by visiting each method parameter
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occurred
   * @throws ODataApplicationException Thrown by the application
   */
  T visitMethodCall(MethodKind methodCall, List<T> parameters)
      throws ExpressionVisitException, ODataApplicationException;

  /**
   * Called for each traversed lambda expression
   * @param lambdaFunction "ALL" or "ANY"
   * @param lambdaVariable Variable name used lambda variable
   * @param expression Lambda expression
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occured
   * @throws ODataApplicationException Thrown by the application
   */
  T visitLambdaExpression(String lambdaFunction, String lambdaVariable, Expression expression)
      throws ExpressionVisitException, ODataApplicationException;

  /**
   * Called for each traversed {@link Literal} expression
   * @param literal Literal
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occured
   * @throws ODataApplicationException Thrown by the application
   */
  T visitLiteral(String literal) throws ExpressionVisitException, ODataApplicationException;

  /**
   * Called for each traversed {@link Member} expression
   * @param member UriInfoResource object describing the whole path used to access an data value
   * (this includes for example the usage of $root and $it inside the URI)
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occured
   * @throws ODataApplicationException Thrown by the application
   */
  T visitMember(UriInfoResource member) throws ExpressionVisitException, ODataApplicationException;

  /**
   * Called for each traversed {@link Alias} expression
   * @param aliasName Name of the alias
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occured
   * @throws ODataApplicationException Thrown by the application
   */
  T visitAlias(String aliasName) throws ExpressionVisitException, ODataApplicationException;

  /**
   * Called for each traversed {@link TypeLiteral} expression
   * @param type EdmType
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occured
   * @throws ODataApplicationException Thrown by the application
   */
  T visitTypeLiteral(EdmType type) throws ExpressionVisitException, ODataApplicationException;

  /**
   * Called for each traversed {@link LambdaRef}
   * @param variableName Name of the used lambda variable
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occured
   * @throws ODataApplicationException Thrown by the application
   */
  T visitLambdaReference(String variableName) throws ExpressionVisitException, ODataApplicationException;

  /**
   * Called for each traversed {@link Enumeration} expression
   * @param type Type used in the URI before the enumeration values
   * @param enumValues List of enumeration values
   * @return Application return value of type T
   * @throws ExpressionVisitException Thrown if an exception while traversing occured
   * @throws ODataApplicationException Thrown by the application
   */
  T visitEnum(EdmEnumType type, List<String> enumValues) throws ExpressionVisitException, ODataApplicationException;

}
