/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed 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.
 */

#include <oxs_error.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <axis2_log_default.h>
#include <platforms/axis2_platform_auto_sense.h>
/*Table to map error codes with the error message*/
#define OXS_ERRORS_MAX_NUMBER 64
static oxs_error_description oxs_errors_table[OXS_ERRORS_MAX_NUMBER] =
    {
        {
            OXS_ERROR_DEFAULT, "oxs defualt error"
        },
        {OXS_ERROR_ENCRYPT_FAILED , "encryption failed" },
        {OXS_ERROR_DECRYPT_FAILED , "decryption failed"},
        {OXS_ERROR_INVALID_DATA , "invalid data"},
        {OXS_ERROR_INVALID_SIZE , "invalid size"},
        {OXS_ERROR_INVALID_FORMAT , "invalid format"},
        {OXS_ERROR_ELEMENT_FAILED , "element failed"},
    };

AXIS2_EXTERN const char* AXIS2_CALL
oxs_errors_get_msg_by_code(int code)
{
    const char* error_msg = NULL;
    unsigned int i;

    for (i = 0; (i < OXS_ERRORS_MAX_NUMBER) && (oxs_errors_get_msg(i)); ++i)
    {
        if (oxs_errors_get_code(i) == code)
        {
            error_msg = oxs_errors_get_msg(i);
            break;
        }
    }
    return error_msg;

}

AXIS2_EXTERN int AXIS2_CALL
oxs_errors_get_code(unsigned int pos)
{
    if (pos < sizeof(oxs_errors_table) / sizeof(oxs_errors_table[0]))
    {
        return(oxs_errors_table[pos].code);
    }
    return(0);
}

AXIS2_EXTERN const char* AXIS2_CALL
oxs_errors_get_msg(unsigned int pos)
{
    if (pos < sizeof(oxs_errors_table) / sizeof(oxs_errors_table[0]))
    {
        return(oxs_errors_table[pos].message);
    }
    return(NULL);
}

AXIS2_EXTERN void   AXIS2_CALL
oxs_error(const char* file, int line, const char* func,
        int code, const char* msg, ...)
{
    const char* error_msg = NULL;
    char value[AXIS2_LEN_VALUE+1];
    va_list ap;

    error_msg = oxs_errors_get_msg_by_code(code);
    /*TODO Log instead of printf*/

    va_start(ap, msg);
    AXIS2_VSNPRINTF(value, AXIS2_LEN_VALUE, msg, ap);
    va_end(ap);


    printf("\nERROR [%s:%d in %s] %s , %s\n", file, line, func, error_msg, value);
}
