/*
 * 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.cordova.globalization;

import org.apache.cordova.json4j.JSONException;
import org.apache.cordova.json4j.JSONObject;

/**
 * User initiated exception. Exception class representing defined Globalization
 * error codes.
 *
 * Globalization error codes:
 *          GlobalizationError.UNKNOWN_ERROR = 0;
 *          GlobalizationError.FORMATTING_ERROR = 1;
 *          GlobalizationError.PARSING_ERROR = 2;
 *          GlobalizationError.PATTERN_ERROR = 3;
 */
public class GlobalizationError extends Exception {

    private static final long serialVersionUID = 1L;
    public static final String UNKNOWN_ERROR = "UNKNOWN_ERROR";
    public static final String FORMATTING_ERROR = "FORMATTING_ERROR";
    public static final String PARSING_ERROR = "PARSING_ERROR";
    public static final String PATTERN_ERROR = "PATTERN_ERROR";

    int error = 0; // default unknown error thrown

    /**
     * Default constructor
     */
    public GlobalizationError() {
    }

    /**
     * Create an exception returning an error code
     *
     * @param s
     */
    public GlobalizationError(String s) {
        if (s.equalsIgnoreCase(FORMATTING_ERROR)) {
            error = 1;
        } else if (s.equalsIgnoreCase(PARSING_ERROR)) {
            error = 2;
        } else if (s.equalsIgnoreCase(PATTERN_ERROR)) {
            error = 3;
        }
    }

    /**
     * get error string based on error code
     *
     * @param String
     *            msg
     */
    public String getErrorString() {
        String msg = "";
        switch (error) {
        case 0:
            msg = UNKNOWN_ERROR;
            break;
        case 1:
            msg = FORMATTING_ERROR;
            break;
        case 2:
            msg = PARSING_ERROR;
            break;
        case 3:
            msg = PATTERN_ERROR;
            break;
        }
        return msg;
    }

    /**
     * get error code
     *
     * @param String
     *            msg
     */
    public int getErrorCode() {
        return error;
    }

    /**
     * get the json version of this object to return to javascript
     *
     * @return
     */
    public JSONObject toJson() {
        JSONObject obj = new JSONObject();
        try {
            obj.put("code", getErrorCode());
            obj.put("message", getErrorString());
        } catch (JSONException e) {
            // never happens
        }
        return obj;
    }
}
