/*
 * File    : BasicEvaluator.java
 * Created : 07-jun-2001 13:50
 * By      : fbusquets
 *
 * JClic - Authoring and playing system for educational activities
 *
 * Copyright (C) 2000 - 2018 Francesc Busquets & Departament
 * d'Educacio de la Generalitat de Catalunya
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 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 (see the LICENSE file).
 */

package edu.xtec.jclic.activities.text;

import edu.xtec.jclic.project.JClicProject;
import edu.xtec.util.JDomUtility;
import java.text.Collator;

/**
 * @author Francesc Busquets (fbusquets@xtec.cat)
 * @version 13.08.08
 */
public class BasicEvaluator extends Evaluator {

  public static final String CHECK_CASE = "checkCase";
  public static final String CHECK_ACCENTS = "checkAccents";
  public static final String CHECK_PUNCTUATION = "checkPunctuation";
  public static final String CHECK_DOUBLE_SPACES = "checkDoubleSpaces";
  public static final String PUNCTUATION = ".,;:";

  protected boolean checkCase;
  protected boolean checkAccents;
  protected boolean checkPunctuation;
  protected boolean checkDoubleSpaces;

  int strength;

  /** Creates new BasicEvaluator */
  public BasicEvaluator(JClicProject project) {
    super(project);
    checkCase = false;
    checkAccents = true;
    checkPunctuation = true;
    checkDoubleSpaces = false;
    init();
  }

  @Override
  public org.jdom.Element getJDomElement() {
    org.jdom.Element e = super.getJDomElement();

    if (checkCase)
      e.setAttribute(CHECK_CASE, JDomUtility.boolString(checkCase));
    if (!checkAccents)
      e.setAttribute(CHECK_ACCENTS, JDomUtility.boolString(checkAccents));
    if (!checkPunctuation)
      e.setAttribute(CHECK_PUNCTUATION, JDomUtility.boolString(checkPunctuation));
    if (checkDoubleSpaces)
      e.setAttribute(CHECK_DOUBLE_SPACES, JDomUtility.boolString(checkDoubleSpaces));

    return e;
  }

  @Override
  public void setProperties(org.jdom.Element e, Object aux) throws Exception {
    super.setProperties(e, aux);
    checkCase = JDomUtility.getBoolAttr(e, CHECK_CASE, false);
    checkAccents = JDomUtility.getBoolAttr(e, CHECK_ACCENTS, true);
    checkPunctuation = JDomUtility.getBoolAttr(e, CHECK_PUNCTUATION, true);
    checkDoubleSpaces = JDomUtility.getBoolAttr(e, CHECK_DOUBLE_SPACES, false);
  }

  public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) {
    checkCase = c3a.avMaj;
    checkAccents = c3a.avAcc;
    checkPunctuation = c3a.avPunt;
    checkDoubleSpaces = c3a.avDblSpc;
  }

  @Override
  protected void init() {
    super.init();
    strength = checkAccents ? checkCase ? Collator.TERTIARY : Collator.SECONDARY : Collator.PRIMARY;
    collator.setStrength(strength);
  }

  public boolean checkText(String text, String match) {
    return collator.equals(getClearedText(text), getClearedText(match));
  }

  public byte[] evalText(String text, String[] match) {
    byte[] flags = new byte[text.length()];
    boolean result = checkText(text, match);
    for (int i = 0; i < flags.length; i++) {
      flags[i] = result ? FLAG_OK : FLAG_DEFAULT_ERROR;
    }
    return flags;
  }

  protected String getClearedText(String src) {
    return getClearedText(src, null);
  }

  protected String getClearedText(String src, boolean[] skipped) {

    if (skipped == null)
      skipped = new boolean[src.length()];

    for (int i = 0; i < src.length(); i++)
      skipped[i] = false;

    if (checkPunctuation && checkDoubleSpaces)
      return src;

    StringBuilder sb = new StringBuilder();
    boolean wasSpace = false;
    for (int i = 0; i < src.length(); i++) {
      char ch = src.charAt(i);
      if (PUNCTUATION.indexOf(ch) >= 0 && !checkPunctuation) {
        if (!wasSpace)
          sb.append(' ');
        else
          skipped[i] = true;
        wasSpace = true;
      } else if (ch == ' ') {
        if (checkDoubleSpaces || !wasSpace)
          sb.append(ch);
        else
          skipped[i] = true;
        wasSpace = true;
      } else {
        wasSpace = false;
        sb.append(ch);
      }
    }
    return sb.substring(0);
  }
}
