/**
 * Copyright (C) 2003-2007 eXo Platform SAS.
 *
 * 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see<http://www.gnu.org/licenses/>.
 **/
package org.exoplatform.faq.service;

import java.util.Date;
import java.util.List;

/**
 * Created by The eXo Platform SARL
 * Author : Hung Nguyen Quang
 * hung.nguyen@exoplatform.com
 * Jul 11, 2007
 */
public class QueryStatement {

  /** The Constant QUESTION. */
  public static final String QUESTION    = "exo:faqQuestion";

  /** The Constant CATEGORY. */
  public static final String CATEGORY    = "exo:faqCategory";

  /** The Constant ASC. */
  public static final String ASC         = "ascending";

  /** The Constant DESC. */
  public static final String DESC        = "descending";

  /** The type. */
  private String             type        = QUESTION;

  /** The text. */
  private String             text        = null;

  /** The order by. */
  private String[]           orderBy;

  /** The order type. */
  private String             orderType   = ASC;              // ascending or descending

  /** The created date. */
  private Date               createdDate;

  // properties for question
  /** The question. */
  private String             question;

  /** The author. */
  private String             author;

  /** The email. */
  private String             email;

  /** The is activated. */
  private boolean            isActivated = true;

  /** The is approved. */
  private boolean            isApproved  = true;

  /** The category id. */
  private String             categoryId;

  /** The responses. */
  private List<String>       responses;

  /** The relations. */
  private List<String>       relations;

  /** The name. */
  private String             name;

  /** The description. */
  private String             description;

  /** The moderators. */
  private List<String>       moderators;

  /**
   * Gets the type.
   * 
   * @return the type
   */
  public String getType() {
    return type;
  }

  /**
   * Sets the type.
   * 
   * @param nt the new type
   */
  public void setType(String nt) {
    this.type = nt;
  }

  /**
   * Sets the text.
   * 
   * @param fullTextSearch the new text
   */
  public void setText(String fullTextSearch) {
    this.text = fullTextSearch;
  }

  /**
   * Gets the text.
   * 
   * @return the text
   */
  public String getText() {
    return text;
  }

  /**
   * Gets the order by.
   * 
   * @return the order by
   */
  public String[] getOrderBy() {
    return orderBy;
  }

  /**
   * Sets the order by.
   * 
   * @param order the new order by
   */
  public void setOrderBy(String[] order) {
    this.orderBy = order;
  }

  /**
   * Gets the order type.
   * 
   * @return the order type
   */
  public String getOrderType() {
    return orderType;
  }

  /**
   * Sets the order type.
   * 
   * @param type the new order type
   */
  public void setOrderType(String type) {
    this.orderType = type;
  }

  /**
   * Sets the created date.
   * 
   * @param createdDate the new created date
   */
  public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
  }

  /**
   * Gets the created date.
   * 
   * @return the created date
   */
  public Date getCreatedDate() {
    return createdDate;
  }

  // properties for question

  /**
   * Gets the question.
   * 
   * @return the question
   */
  public String getQuestion() {
    return question;
  }

  /**
   * Sets the question.
   * 
   * @param name the new question
   */
  public void setQuestion(String name) {
    this.question = name;
  }

  /**
   * Gets the responses.
   * 
   * @return the responses
   */
  public List<String> getResponses() {
    return responses;
  }

  /**
   * Sets the responses.
   * 
   * @param rp the new responses
   */
  public void setResponses(List<String> rp) {
    this.responses = rp;
  }

  /**
   * Gets the relations.
   * 
   * @return the relations
   */
  public List<String> getRelations() {
    return relations;
  }

  /**
   * Sets the relations.
   * 
   * @param rl the new relations
   */
  public void setRelations(List<String> rl) {
    this.relations = rl;
  }

  /**
   * Sets the author.
   * 
   * @param author the new author
   */
  public void setAuthor(String author) {
    this.author = author;
  }

  /**
   * Gets the author.
   * 
   * @return the author
   */
  public String getAuthor() {
    return author;
  }

  /**
   * Sets the email.
   * 
   * @param email the new email
   */
  public void setEmail(String email) {
    this.email = email;
  }

  /**
   * Gets the email.
   * 
   * @return the email
   */
  public String getEmail() {
    return email;
  }

  /**
   * Sets the activated.
   * 
   * @param isActivated the new activated
   */
  public void setActivated(boolean isActivated) {
    this.isActivated = isActivated;
  }

  /**
   * Checks if is activated.
   * 
   * @return true, if is activated
   */
  public boolean isActivated() {
    return isActivated;
  }

  /**
   * Sets the approved.
   * 
   * @param isApproved the new approved
   */
  public void setApproved(boolean isApproved) {
    this.isApproved = isApproved;
  }

  /**
   * Checks if is approved.
   * 
   * @return true, if is approved
   */
  public boolean isApproved() {
    return isApproved;
  }

  /**
   * Sets the category id.
   * 
   * @param catId the new category id
   */
  public void setCategoryId(String catId) {
    this.categoryId = catId;
  }

  /**
   * Gets the category id.
   * 
   * @return the category id
   */
  public String getCategoryId() {
    return categoryId;
  }

  // properties for category

  /**
   * Gets the name.
   * 
   * @return the name
   */
  public String getName() {
    return name;
  }

  /**
   * Sets the name.
   * 
   * @param name the new name
   */
  public void setName(String name) {
    this.name = name;
  }

  /**
   * Gets the description.
   * 
   * @return the description
   */
  public String getDescription() {
    return description;
  }

  /**
   * Sets the description.
   * 
   * @param description the new description
   */
  public void setDescription(String description) {
    this.description = description;
  }

  /**
   * Gets the moderators.
   * 
   * @return the moderators
   */
  public List<String> getModerators() {
    return moderators;
  }

  /**
   * Sets the moderators.
   * 
   * @param mods the new moderators
   */
  public void setModerators(List<String> mods) {
    this.moderators = mods;
  }

  /**
   * Gets the query statement.
   * 
   * @return the query statement
   * 
   * @throws Exception the exception
   */
  public String getQueryStatement() throws Exception {
    return null;
  }

  /*
   * public String getQueryStatement() throws Exception { StringBuffer queryString = null ; if(calendarPath != null) queryString = new StringBuffer("/jcr:root" + calendarPath + "//element(*," + type + ")") ; else queryString = new StringBuffer("/jcr:root//element(*," + type + ")") ; boolean hasConjuntion = false ; StringBuffer stringBuffer = new StringBuffer("[") ; //desclared full text query
   * if(text != null && text.length() > 0) { stringBuffer.append("jcr:contains(., '").append(text).append("')") ; hasConjuntion = true ; } //desclared event type query if(eventType != null && eventType.length() > 0) { if(hasConjuntion) stringBuffer.append(" and (") ; else stringBuffer.append("(") ; stringBuffer.append("@exo:eventType='" + eventType +"'") ; stringBuffer.append(")") ; hasConjuntion
   * = true ; } //desclared priority query if(priority != null && priority.length() > 0) { if(hasConjuntion) stringBuffer.append(" and (") ; else stringBuffer.append("(") ; stringBuffer.append("@exo:priority='" + priority +"'") ; stringBuffer.append(")") ; hasConjuntion = true ; } //desclared state query if(state != null && state.length() > 0) { if(hasConjuntion) stringBuffer.append(" and (") ;
   * else stringBuffer.append("(") ; stringBuffer.append("@exo:eventState='" + state +"'") ; stringBuffer.append(")") ; hasConjuntion = true ; } //desclared category query if(categoryIds != null && categoryIds.length > 0) { if(hasConjuntion) stringBuffer.append(" and (") ; else stringBuffer.append("(") ; for(int i = 0; i < categoryIds.length; i ++) { if(i == 0)
   * stringBuffer.append("@exo:eventCategoryId='" + categoryIds[i] +"'") ; else stringBuffer.append(" or @exo:eventCategoryId='" + categoryIds[i] +"'") ; } stringBuffer.append(")") ; hasConjuntion = true ; } // desclared calendar query if(calendarIds != null && calendarIds.length > 0) { if(hasConjuntion) stringBuffer.append(" and (") ; else stringBuffer.append("(") ; for(int i = 0; i <
   * calendarIds.length; i ++) { if(i == 0) stringBuffer.append("@exo:calendarId='" + calendarIds[i] +"'") ; else stringBuffer.append(" or @exo:calendarId='" + calendarIds[i] +"'") ; } stringBuffer.append(")") ; hasConjuntion = true ; } if(filterCalendarIds != null && filterCalendarIds.length > 0) { if(hasConjuntion) stringBuffer.append(" and (") ; else stringBuffer.append("(") ; for(int i = 0; i
   * < filterCalendarIds.length; i ++) { if(i == 0) stringBuffer.append("@exo:calendarId !='" + filterCalendarIds[i] +"'") ; else stringBuffer.append(" and @exo:calendarId !='" + filterCalendarIds[i] +"'") ; } stringBuffer.append(")") ; hasConjuntion = true ; } // desclared participants query if(participants != null && participants.length > 0) { if(hasConjuntion) stringBuffer.append(" and (") ;
   * else stringBuffer.append("(") ; for(int i = 0; i < participants.length; i ++) { if(i == 0) stringBuffer.append("@exo:participant='" + participants[i] +"'") ; else stringBuffer.append(" or @exo:participant='" + participants[i] +"'") ; } stringBuffer.append(")") ; hasConjuntion = true ; } // desclared Date time if(fromDate != null && toDate != null){ if(hasConjuntion)
   * stringBuffer.append(" and (") ; else stringBuffer.append("(") ; stringBuffer.append("(") ; stringBuffer.append("@exo:fromDateTime >= xs:dateTime('"+ISO8601.format(fromDate)+"') and ") ; stringBuffer.append("@exo:toDateTime <= xs:dateTime('"+ISO8601.format(toDate)+"')") ; stringBuffer.append(") or (") ; stringBuffer.append("@exo:fromDateTime < xs:dateTime('"+ISO8601.format(fromDate)+"') and ")
   * ; stringBuffer.append("@exo:toDateTime > xs:dateTime('"+ISO8601.format(toDate)+"')") ; stringBuffer.append(") or (") ; stringBuffer.append("@exo:fromDateTime < xs:dateTime('"+ISO8601.format(fromDate)+"') and ") ; stringBuffer.append("@exo:toDateTime > xs:dateTime('"+ISO8601.format(fromDate)+"') and ") ; stringBuffer.append("@exo:toDateTime <= xs:dateTime('"+ISO8601.format(toDate)+"')") ;
   * stringBuffer.append(") or (") ; stringBuffer.append("@exo:fromDateTime >= xs:dateTime('"+ISO8601.format(fromDate)+"') and ") ; stringBuffer.append("@exo:fromDateTime < xs:dateTime('"+ISO8601.format(toDate)+"') and ") ; stringBuffer.append("@exo:toDateTime > xs:dateTime('"+ISO8601.format(toDate)+"')") ; stringBuffer.append(")") ; stringBuffer.append(")") ; hasConjuntion = true ; }else
   * if(fromDate != null) { if(hasConjuntion) stringBuffer.append(" and (") ; else stringBuffer.append("(") ; stringBuffer.append("(") ; stringBuffer.append("@exo:fromDateTime >= xs:dateTime('"+ISO8601.format(fromDate)+"')") ; stringBuffer.append(") or (") ; stringBuffer.append("@exo:fromDateTime < xs:dateTime('"+ISO8601.format(fromDate)+"') and ") ;
   * stringBuffer.append("@exo:toDateTime > xs:dateTime('"+ISO8601.format(fromDate)+"')") ; stringBuffer.append(")") ; stringBuffer.append(")") ; hasConjuntion = true ; }else if(toDate != null) { if(hasConjuntion) stringBuffer.append(" and (") ; else stringBuffer.append("(") ; stringBuffer.append("(") ; stringBuffer.append("@exo:toDateTime <= xs:dateTime('"+ISO8601.format(toDate)+"')") ;
   * stringBuffer.append(") or (") ; stringBuffer.append("@exo:fromDateTime < xs:dateTime('"+ISO8601.format(toDate)+"') and ") ; stringBuffer.append("@exo:toDateTime > xs:dateTime('"+ISO8601.format(toDate)+"')") ; stringBuffer.append(")") ; stringBuffer.append(")") ; hasConjuntion = true ; } stringBuffer.append("]") ; //declared order by if(orderBy != null && orderBy.length > 0 && orderType !=
   * null && orderType.length() > 0) { for(int i = 0; i < orderBy.length; i ++) { if(i == 0) stringBuffer.append(" order by @" + orderBy[i].trim() + " " + orderType) ; else stringBuffer.append(", order by @" + orderBy[i].trim() + " " + orderType) ; } hasConjuntion = true ; } if(hasConjuntion) queryString.append(stringBuffer.toString()) ; return queryString.toString() ; }
   */
}
