/*
 * 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.
 */

#include <qpid/dispatch/proton_utils.h>
#include <string.h>
#include <inttypes.h>
#include <time.h>
#include <ctype.h>
#include <stdio.h>

char *qdpn_data_as_string(pn_data_t *data)
{
#define MAX_BUFFER 50
    char buffer[MAX_BUFFER + 1];
    buffer[MAX_BUFFER] = '\0';

    switch(pn_data_type(data)) {
    case PN_BOOL:
        return strdup(pn_data_get_bool(data) ? "true" : "false");

    case PN_UBYTE:
        snprintf(buffer, MAX_BUFFER, "%"PRId8, pn_data_get_ubyte(data));
        return strdup(buffer);

    case PN_BYTE:
        snprintf(buffer, MAX_BUFFER, "%"PRId8, pn_data_get_byte(data));
        return strdup(buffer);

    case PN_USHORT:
        snprintf(buffer, MAX_BUFFER, "%"PRId16, pn_data_get_ushort(data));
        return strdup(buffer);

    case PN_SHORT:
        snprintf(buffer, MAX_BUFFER, "%"PRId16, pn_data_get_short(data));
        return strdup(buffer);

    case PN_UINT:
        snprintf(buffer, MAX_BUFFER, "%"PRId32, pn_data_get_uint(data));
        return strdup(buffer);

    case PN_INT:
        snprintf(buffer, MAX_BUFFER, "%"PRId32, pn_data_get_int(data));
        return strdup(buffer);

    case PN_CHAR: {
        char c = (char) pn_data_get_char(data);
        return strndup(&c, 1);
    }

    case PN_ULONG:
        snprintf(buffer, MAX_BUFFER, "%"PRId64, pn_data_get_ulong(data));
        return strdup(buffer);

    case PN_LONG:
        snprintf(buffer, MAX_BUFFER, "%"PRId64, pn_data_get_long(data));
        return strdup(buffer);

    case PN_TIMESTAMP: {
#if _POSIX_C_SOURCE || _BSD_SOURCE || _SVID_SOURCE
        time_t t = (time_t) (pn_data_get_timestamp(data));
        ctime_r(&t, buffer);
        size_t len = strlen(buffer);
        if (buffer[len - 1] == '\n')
            buffer[len - 1] = '\0';
        return strdup(buffer);
#else
        snprintf(buffer, MAX_BUFFER, "%"PRId64, pn_data_get_timestamp(data));
        return strdup(buffer);
#endif
    }

    case PN_FLOAT:
        snprintf(buffer, MAX_BUFFER, "%lg", pn_data_get_float(data));
        return strdup(buffer);

    case PN_DOUBLE:
        snprintf(buffer, MAX_BUFFER, "%lg", pn_data_get_double(data));
        return strdup(buffer);

    case PN_DECIMAL32:
        snprintf(buffer, MAX_BUFFER, "%"PRId32, pn_data_get_decimal32(data));
        return strdup(buffer);

    case PN_DECIMAL64:
        snprintf(buffer, MAX_BUFFER, "%"PRId64, pn_data_get_decimal64(data));
        return strdup(buffer);

    case PN_UUID: {
        pn_uuid_t uuid = pn_data_get_uuid(data);
        uint8_t  *u    = (uint8_t*) uuid.bytes;
        snprintf(buffer, MAX_BUFFER,
                 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
                 u[0], u[1], u[2],  u[3],  u[4],  u[5],  u[6],  u[7],
                 u[8], u[9], u[10], u[11], u[12], u[13], u[14], u[15]);
        return strdup(buffer);
    }

    case PN_BINARY: {
        pn_bytes_t bytes = pn_data_get_binary(data);

        //
        // Search the binary field for unprintable characters.  If found, don't return a
        // string representation.
        //
        for (int i = 0; i < bytes.size; i++) {
            if (!isprint(bytes.start[i]))
                return 0;
        }

        return strndup(bytes.start, bytes.size);
    }

    case PN_STRING:
        return strdup(pn_data_get_string(data).start);

    case PN_SYMBOL:
        return strdup(pn_data_get_symbol(data).start);

    //
    // Return null for the following types:
    //
    case PN_DECIMAL128:
    case PN_DESCRIBED:
    case PN_ARRAY:
    case PN_LIST:
    case PN_MAP:
    case PN_NULL:
    default:
        break;
    }

    return 0;
}



