/*
 * Aipo is a groupware program developed by TOWN, Inc.
 * Copyright (C) 2004-2015 TOWN, Inc.
 * http://www.aipo.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.aimluck.eip.orm.query;

import java.util.List;

import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;

public class Where {

  protected Expression exp = null;

  protected boolean isOr = false;

  public Where eq(String property, Object value) {
    concat(ExpressionFactory.matchExp(property, value));
    return this;
  }

  public Where ne(String property, Object value) {
    concat(ExpressionFactory.noMatchExp(property, value));
    return this;
  }

  public Where lt(String property, Object value) {
    concat(ExpressionFactory.lessExp(property, value));
    return this;
  }

  public Where le(String property, Object value) {
    concat(ExpressionFactory.lessOrEqualExp(property, value));
    return this;
  }

  public Where gt(String property, Object value) {
    concat(ExpressionFactory.greaterExp(property, value));
    return this;
  }

  public Where ge(String property, Object value) {
    concat(ExpressionFactory.greaterOrEqualExp(property, value));
    return this;
  }

  public Where in(String property, Object... values) {
    concat(ExpressionFactory.inExp(property, values));
    return this;
  }

  public Where in(String property, List<?> values) {
    concat(ExpressionFactory.inExp(property, values));
    return this;
  }

  public Where notIn(String property, Object... values) {
    concat(ExpressionFactory.notInExp(property, values));
    return this;
  }

  public Where notIn(String property, List<?> values) {
    concat(ExpressionFactory.notInExp(property, values));
    return this;
  }

  public Where like(String property, Object value) {
    concat(ExpressionFactory.likeExp(property, value));
    return this;
  }

  public Where contains(String property, Object value) {
    concat(ExpressionFactory.likeExp(property, "%" + value + "%"));
    return this;
  }

  public Where startWith(String property, Object value) {
    concat(ExpressionFactory.likeExp(property, value + "%"));
    return this;
  }

  public Where endWith(String property, Object value) {
    concat(ExpressionFactory.likeExp(property, "%" + value));
    return this;
  }

  public Where or() {
    isOr = true;
    return this;
  }

  public Where or(Where where) {
    if (exp == null) {
      exp = where.exp;
    } else {
      exp.orExp(where.exp);
    }
    return this;
  }

  public Where and(Where where) {
    if (exp == null) {
      exp = where.exp;
    } else {
      exp.andExp(where.exp);
    }
    return this;
  }

  protected void concat(Expression exp) {
    if (this.exp == null) {
      this.exp = exp;
    } else {
      if (isOr) {
        this.exp.orExp(exp);
        isOr = false;
      } else {
        this.exp.andExp(exp);
      }
    }
  }
}
