/**
 * @file json_utils.c
 * @brief 轻量 JSON 字符串工具实现
 */

#include "json_utils.h"
#include <string.h>

int json_unescape(const char *src, int src_len, char *dst, int dst_size)
{
    if (!src || !dst || dst_size <= 0) {
        return -1;
    }

    int i = 0;
    int j = 0;

    /* 如果首尾有引号则剥离 */
    if (src_len >= 2 && src[0] == '"' && src[src_len - 1] == '"') {
        i = 1;
        src_len -= 1;
    }

    while (i < src_len && j < dst_size - 1) {
        char c = src[i];
        if (c == '\\' && (i + 1) < src_len) {
            char next = src[i + 1];
            i += 2;
            switch (next) {
            case '"':
                dst[j++] = '"';
                break;
            case '\\':
                dst[j++] = '\\';
                break;
            case '/':
                dst[j++] = '/';
                break;
            case 'n':
                dst[j++] = '\n';
                break;
            case 't':
                dst[j++] = '\t';
                break;
            case 'r':
                dst[j++] = '\r';
                break;
            case 'b':
                dst[j++] = '\b';
                break;
            default:
                dst[j++] = next;
                break;
            }
        } else {
            dst[j++] = c;
            i++;
        }
    }
    dst[j] = '\0';
    return j;
}

int json_find_string_value(const char *json, int json_len,
                           const char *key,
                           const char **out_start, int *out_len)
{
    if (!json || !key || !out_start || !out_len) {
        return -1;
    }

    int key_len = strlen(key);
    const char *p = json;
    const char *end = json + json_len;

    while (p < end) {
        /* 找开引号 */
        p = memchr(p, '"', end - p);
        if (!p) {
            return -1;
        }
        p++; /* 跳过开引号 */

        /* 检查是否匹配 key */
        if ((end - p) > key_len &&
            memcmp(p, key, key_len) == 0 && p[key_len] == '"') {

            /* 匹配，跳到值 */
            p += key_len + 1;
            while (p < end && (*p == ':' || *p == ' ' || *p == '\t')) {
                p++;
            }

            /* 值必须是字符串（以 " 开头） */
            if (p < end && *p == '"') {
                const char *val_start = p;
                p++; /* 跳过开引号 */
                while (p < end && *p != '"') {
                    if (*p == '\\') {
                        p += 2;
                        continue;
                    }
                    p++;
                }
                if (p < end) {
                    *out_start = val_start;
                    *out_len = (int)(p - val_start + 1);
                    return 0;
                }
            }
            return -1;
        }

        /* 跳过当前字符串内容 */
        while (p < end && *p != '"') {
            if (*p == '\\') {
                p += 2;
                continue;
            }
            p++;
        }
        if (p < end) {
            p++;
        }
    }
    return -1;
}
