/*********************************************************************
 *
 *      Copyright (C) 2005 Andrew Khan
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ***************************************************************************/

package org.xbib.datastructures.xslx.jxl.biff.formula;

/**
 * Enumeration for formula error codes
 */
public class FormulaErrorCode {
    public static final FormulaErrorCode UNKNOWN =
            new FormulaErrorCode(0xff, "?");
    public static final FormulaErrorCode NULL =
            new FormulaErrorCode(0x0, "#NULL!");
    public static final FormulaErrorCode DIV0 =
            new FormulaErrorCode(0x7, "#DIV/0!");
    public static final FormulaErrorCode VALUE =
            new FormulaErrorCode(0xf, "#VALUE!");
    public static final FormulaErrorCode REF =
            new FormulaErrorCode(0x17, "#REF!");
    public static final FormulaErrorCode NAME =
            new FormulaErrorCode(0x1d, "#NAME?");
    public static final FormulaErrorCode NUM = new FormulaErrorCode(0x24,
            "#NUM!");
    public static final FormulaErrorCode NA = new FormulaErrorCode(0x2a,
            "#N/A!");
    /**
     * The list of error codes
     */
    private static FormulaErrorCode[] codes = new FormulaErrorCode[0];
    /**
     * The error code
     */
    private final int errorCode;
    /**
     * The description
     */
    private final String description;
    /**
     * Constructor
     *
     * @param code the code
     * @param desc the description
     */
    FormulaErrorCode(int code, String desc) {
        errorCode = code;
        description = desc;
        FormulaErrorCode[] newcodes = new FormulaErrorCode[codes.length + 1];
        System.arraycopy(codes, 0, newcodes, 0, codes.length);
        newcodes[codes.length] = this;
        codes = newcodes;
    }

    /**
     * Gets the error type given just the code
     *
     * @param code the code to lookup
     * @return the error type
     */
    public static FormulaErrorCode getErrorCode(int code) {
        boolean found = false;
        FormulaErrorCode ec = UNKNOWN;
        for (int i = 0; i < codes.length && !found; i++) {
            if (codes[i].errorCode == code) {
                found = true;
                ec = codes[i];
            }
        }
        return ec;
    }

    /**
     * Gets the error type given the string value
     *
     * @param code the code to lookup
     * @return the error type
     */
    public static FormulaErrorCode getErrorCode(String code) {
        boolean found = false;
        FormulaErrorCode ec = UNKNOWN;

        if (code == null || code.length() == 0) {
            return ec;
        }

        for (int i = 0; i < codes.length && !found; i++) {
            if (codes[i].description.equals(code)) {
                found = true;
                ec = codes[i];
            }
        }
        return ec;
    }

    /**
     * Accessor for the code
     *
     * @return the code
     */
    public int getCode() {
        return errorCode;
    }

    /**
     * Accessor for the description
     *
     * @return the description
     */
    public String getDescription() {
        return description;
    }
}
