/*
 * 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.uima.ruta.verbalize;

import java.util.Iterator;

import org.apache.commons.lang3.StringUtils;
import org.apache.uima.cas.CAS;
import org.apache.uima.ruta.expression.AnnotationTypeExpression;
import org.apache.uima.ruta.expression.IRutaExpression;
import org.apache.uima.ruta.expression.MatchReference;
import org.apache.uima.ruta.expression.NullExpression;
import org.apache.uima.ruta.expression.annotation.AnnotationAddressExpression;
import org.apache.uima.ruta.expression.annotation.AnnotationLabelExpression;
import org.apache.uima.ruta.expression.annotation.AnnotationVariableExpression;
import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
import org.apache.uima.ruta.expression.bool.BooleanFeatureExpression;
import org.apache.uima.ruta.expression.bool.BooleanListVariableExpression;
import org.apache.uima.ruta.expression.bool.BooleanNumberExpression;
import org.apache.uima.ruta.expression.bool.BooleanTypeExpression;
import org.apache.uima.ruta.expression.bool.BooleanVariableExpression;
import org.apache.uima.ruta.expression.bool.IBooleanExpression;
import org.apache.uima.ruta.expression.bool.SimpleBooleanExpression;
import org.apache.uima.ruta.expression.bool.SimpleBooleanListExpression;
import org.apache.uima.ruta.expression.feature.FeatureExpression;
import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
import org.apache.uima.ruta.expression.feature.GenericFeatureExpression;
import org.apache.uima.ruta.expression.feature.SimpleFeatureExpression;
import org.apache.uima.ruta.expression.list.ListExpression;
import org.apache.uima.ruta.expression.list.UntypedListExpression;
import org.apache.uima.ruta.expression.number.ComposedNumberExpression;
import org.apache.uima.ruta.expression.number.INumberExpression;
import org.apache.uima.ruta.expression.number.NegativeNumberExpression;
import org.apache.uima.ruta.expression.number.NumberFeatureExpression;
import org.apache.uima.ruta.expression.number.NumberListVariableExpression;
import org.apache.uima.ruta.expression.number.NumberVariableExpression;
import org.apache.uima.ruta.expression.number.SimpleNumberExpression;
import org.apache.uima.ruta.expression.number.SimpleNumberListExpression;
import org.apache.uima.ruta.expression.resource.ReferenceWordListExpression;
import org.apache.uima.ruta.expression.resource.ReferenceWordTableExpression;
import org.apache.uima.ruta.expression.resource.WordListExpression;
import org.apache.uima.ruta.expression.resource.WordTableExpression;
import org.apache.uima.ruta.expression.string.ComposedStringExpression;
import org.apache.uima.ruta.expression.string.IStringExpression;
import org.apache.uima.ruta.expression.string.LiteralStringExpression;
import org.apache.uima.ruta.expression.string.SimpleStringExpression;
import org.apache.uima.ruta.expression.string.SimpleStringListExpression;
import org.apache.uima.ruta.expression.string.StringFeatureExpression;
import org.apache.uima.ruta.expression.string.StringListVariableExpression;
import org.apache.uima.ruta.expression.string.StringVariableExpression;
import org.apache.uima.ruta.expression.type.ITypeExpression;
import org.apache.uima.ruta.expression.type.SimpleTypeExpression;
import org.apache.uima.ruta.expression.type.SimpleTypeListExpression;
import org.apache.uima.ruta.expression.type.TypeListVariableExpression;
import org.apache.uima.ruta.expression.type.TypeVariableExpression;

public class ExpressionVerbalizer {

  private RutaVerbalizer verbalizer;

  public ExpressionVerbalizer(RutaVerbalizer verbalizer) {
    super();
    this.verbalizer = verbalizer;
  }

  public String verbalize(IRutaExpression expression) {
    if (expression instanceof GenericFeatureExpression) {
      return verbalize(((GenericFeatureExpression) expression).getFeatureExpression());
    } else if (expression instanceof AnnotationTypeExpression) {
      return verbalize((AnnotationTypeExpression) expression);
    } else if (expression instanceof IAnnotationExpression) {
      return verbalize((IAnnotationExpression) expression);
    } else if (expression instanceof ITypeExpression) {
      return verbalize((ITypeExpression) expression);
    } else if (expression instanceof IBooleanExpression) {
      return verbalize((IBooleanExpression) expression);
    } else if (expression instanceof INumberExpression) {
      return verbalize((INumberExpression) expression);
    } else if (expression instanceof WordListExpression) {
      return verbalize((WordListExpression) expression);
    } else if (expression instanceof WordTableExpression) {
      return verbalize((WordTableExpression) expression);
    } else if (expression instanceof ListExpression<?>) {
      return verbalize((ListExpression<?>) expression);
    } else if (expression instanceof FeatureMatchExpression) {
      return verbalize((FeatureMatchExpression) expression);
    } else if (expression instanceof FeatureExpression) {
      return verbalize((FeatureExpression) expression);
    } else if (expression instanceof IStringExpression) {
      return verbalize((IStringExpression) expression);
    } else if (expression instanceof MatchReference) {
      return verbalize((MatchReference) expression);
    } else if(expression instanceof NullExpression) {
      return "null";
    }
    return expression.getClass().getSimpleName();
  }

  public String verbalize(WordTableExpression expression) {
    if (expression instanceof ReferenceWordTableExpression) {
      ReferenceWordTableExpression e = (ReferenceWordTableExpression) expression;
      return e.getRef();
    }
    return expression.getClass().getSimpleName();
  }

  public String verbalize(WordListExpression expression) {
    if (expression instanceof ReferenceWordListExpression) {
      ReferenceWordListExpression e = (ReferenceWordListExpression) expression;
      return e.getRef();
    }
    return expression.getClass().getSimpleName();
  }

  public String verbalize(ListExpression<?> expression) {
    if (expression instanceof SimpleBooleanListExpression) {
      SimpleBooleanListExpression e = (SimpleBooleanListExpression) expression;
      return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
    } else if (expression instanceof BooleanListVariableExpression) {
      BooleanListVariableExpression e = (BooleanListVariableExpression) expression;
      return e.getVar();
    } else if (expression instanceof SimpleNumberListExpression) {
      SimpleNumberListExpression e = (SimpleNumberListExpression) expression;
      return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
    } else if (expression instanceof NumberListVariableExpression) {
      NumberListVariableExpression e = (NumberListVariableExpression) expression;
      return e.getVar();
    } else if (expression instanceof SimpleStringListExpression) {
      SimpleStringListExpression e = (SimpleStringListExpression) expression;
      return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
    } else if (expression instanceof StringListVariableExpression) {
      StringListVariableExpression e = (StringListVariableExpression) expression;
      return e.getVar();
    } else if (expression instanceof SimpleTypeListExpression) {
      SimpleTypeListExpression e = (SimpleTypeListExpression) expression;
      return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
    } else if (expression instanceof TypeListVariableExpression) {
      TypeListVariableExpression e = (TypeListVariableExpression) expression;
      return e.getVar();
    } else if (expression instanceof UntypedListExpression) {
      UntypedListExpression e = (UntypedListExpression) expression;
      return "{" + verbalizer.verbalizeExpressionList(e.getList()) + "}";
    }
    return expression.getClass().getSimpleName();
  }

  public String verbalize(INumberExpression expression) {
    if (expression == null) {
      return "";
    } else if (expression instanceof NegativeNumberExpression) {
      NegativeNumberExpression e = (NegativeNumberExpression) expression;
      return "-(" + e.getExpression() + ")";
    } else if (expression instanceof NumberVariableExpression) {
      NumberVariableExpression e = (NumberVariableExpression) expression;
      return e.getVar();
    } else if (expression instanceof SimpleNumberExpression) {
      SimpleNumberExpression e = (SimpleNumberExpression) expression;
      return e.getNumber().toString();
    } else if (expression instanceof ComposedNumberExpression) {
      ComposedNumberExpression e = (ComposedNumberExpression) expression;
      INumberExpression ne = e.getExpressions().get(0);
      if (ne == null) {
        return "";
      }
      StringBuilder result = new StringBuilder(verbalize(ne));
      for (int i = 0; i < e.getOperators().size(); i++) {
        result.append(" " + e.getOperators().get(i) + " ");
        if (e.getExpressions().size() > i + 1) {
          result.append(verbalize(e.getExpressions().get(i + 1)));
        }
      }
      return result.toString();
    } else if (expression instanceof NumberFeatureExpression) {
      return verbalize(((NumberFeatureExpression) expression).getFe());
    }
    return expression.getClass().getSimpleName();
  }

  public String verbalize(IBooleanExpression expression) {
    if (expression == null) {
      return "";
    } else if (expression instanceof BooleanNumberExpression) {
      BooleanNumberExpression e = (BooleanNumberExpression) expression;
      return verbalize(e.getFristExpression()) + " " + e.getOperator() + " "
              + verbalize(e.getSecondExpression());
    } else if (expression instanceof BooleanTypeExpression) {
      BooleanTypeExpression e = (BooleanTypeExpression) expression;
      return verbalize(e.getFristExpression()) + " " + e.getOperator() + " "
              + verbalize(e.getSecondExpression());
    } else if (expression instanceof BooleanVariableExpression) {
      BooleanVariableExpression e = (BooleanVariableExpression) expression;
      return e.getVar();
    } else if (expression instanceof SimpleBooleanExpression) {
      SimpleBooleanExpression e = (SimpleBooleanExpression) expression;
      return e.getPrimitiveValue() ? "true" : "false";
    } else if (expression instanceof BooleanFeatureExpression) {
      return verbalize(((BooleanFeatureExpression) expression).getFe());
    }
    return expression.getClass().getSimpleName();
  }

  @SuppressWarnings("rawtypes")
  public String verbalize(IStringExpression expression) {
    if (expression == null) {
      return "";
    } else if (expression instanceof INumberExpression) {
      return verbalize((INumberExpression) expression);
    } else if (expression instanceof ITypeExpression) {
      return verbalize((ITypeExpression) expression);
    } else if (expression instanceof IBooleanExpression) {
      return verbalize((IBooleanExpression) expression);
    } else if (expression instanceof ListExpression) {
      return verbalize((ListExpression) expression);
    } else if (expression instanceof LiteralStringExpression) {
      return verbalize((LiteralStringExpression) expression);
    } else if (expression instanceof StringFeatureExpression) {
      return verbalize(((StringFeatureExpression) expression).getFe());
    }
    return expression.getClass().getSimpleName();
  }

  public String verbalize(LiteralStringExpression expression) {
    if (expression == null) {
      return "";
    } else if (expression instanceof ComposedStringExpression) {
      ComposedStringExpression e = (ComposedStringExpression) expression;
      StringBuilder sb = new StringBuilder();
      Iterator<IStringExpression> it = e.getExpressions().iterator();
      while (it.hasNext()) {
        IStringExpression each = it.next();
        sb.append(verbalize(each));
        if (it.hasNext()) {
          sb.append(" + ");
        }
      }
      return sb.toString();
    } else if (expression instanceof StringVariableExpression) {
      StringVariableExpression e = (StringVariableExpression) expression;
      return e.getVar();
    } else if (expression instanceof SimpleStringExpression) {
      SimpleStringExpression e = (SimpleStringExpression) expression;
      return "\"" + e.getValue() + "\"";
    }
    return expression.getClass().getSimpleName();
  }

  public String verbalize(ITypeExpression expression) {
    if (expression == null) {
      return null;
    }
    if (expression instanceof SimpleTypeExpression) {
      SimpleTypeExpression e = (SimpleTypeExpression) expression;
      String type = e.getTypeString();
      int indexOf = type.lastIndexOf(".");
      if (indexOf != -1) {
        type = type.substring(indexOf + 1, type.length());
      }
      if (type.equals("DocumentAnnotation")) {
        type = "Document";
      }
      return type;
    } else if (expression instanceof TypeVariableExpression) {
      TypeVariableExpression e = (TypeVariableExpression) expression;
      return e.getVar();
    }
    return expression.getClass().getSimpleName();
  }

  public String verbalize(IAnnotationExpression expression) {
    if (expression == null) {
      return null;
    }
    if (expression instanceof AnnotationAddressExpression) {
      AnnotationAddressExpression e = (AnnotationAddressExpression) expression;
      return "$" + e.getAddress();
    } else if (expression instanceof AnnotationVariableExpression) {
      AnnotationVariableExpression e = (AnnotationVariableExpression) expression;
      return e.getVar();
    } else if (expression instanceof AnnotationLabelExpression) {
      AnnotationLabelExpression e = (AnnotationLabelExpression) expression;
      return e.getLabel();
    }
    return expression.getClass().getSimpleName();
  }
  
  public String verbalize(MatchReference expression) {
    String match = expression.getMatch();
    if(match == null) {
      String string = expression.toString();
      if(StringUtils.equals(string, CAS.TYPE_NAME_DOCUMENT_ANNOTATION)) {
        return "Document";
      } else {
        return string;
      }
    }
    if(expression.getArgument() != null) {
     return  match + expression.getComparator() + verbalizer.verbalize(expression.getArgument());
    }
    return match;
  }
  
  public String verbalize(AnnotationTypeExpression expression) {
    return verbalize(expression.getReference());
  }

  public String verbalize(FeatureExpression expression) {
    StringBuilder sb = new StringBuilder();
    if (expression instanceof SimpleFeatureExpression) {
      SimpleFeatureExpression sfe = (SimpleFeatureExpression) expression;
      sb.append(sfe.getMatchReference().getMatch());
    } else if(expression instanceof NullExpression) {
      sb.append("null");
    }
    return sb.toString();
  }

  public String verbalize(FeatureMatchExpression expression) {
    return verbalize((FeatureExpression) expression) + expression.getOp()
            + verbalize(expression.getArg());
  }

}
