#include "libipset.h"

// 自定义输出处理函数
int custom_output_handler(struct ipset_session *session, void *p, const char *msg, ...)
{
    int *ip_count = (int *)p;
    char buffer[BUFFER];

    // 格式化输出消息
    va_list args;
    va_start(args, msg);
    vsnprintf(buffer, sizeof(buffer), msg, args);
    va_end(args);

    // 输出调试信息
    //printf("Buffer: %s\n", buffer); // 调试输出

    if (strlen(buffer) > 1) {
        char temp[BUFFER];
        char *p1 = strstr(buffer, "Number of entries:");
        if (p1 != NULL) {
            char *p2 = strstr(p1, "\n");
            if (p2 != NULL) {
                size_t len = p2 - p1; // 计算长度
                if (len < BUFFER) {
                    strncpy(temp, p1, len);
                    temp[len] = '\0'; // 确保字符串结束
                    //puts(temp);

                    // 查找冒号并提取数量
                    char *p3 = strstr(temp, ":");
                    if (p3 != NULL) {
                        // 提取数字
                        int count = atoi(p3 + 1); // 从冒号后面开始转换
                        *ip_count += count; // 更新计数
                    }
                }
            }
        }
    }

    return 0;
}

int custom_output_handler_(struct ipset_session *session, void *p, const char *msg, ...)
{
    char buffer[BUFFER];

    // 格式化输出消息
    va_list args;
    va_start(args, msg);
    vsnprintf(buffer, sizeof(buffer), msg, args);
    va_end(args);

    // 输出调试信息
    //printf("Buffer: %s\n", buffer); // 调试输出

    return 0;
}

// 自定义错误处理函数
int custom_error_handler(struct ipset *ipset, void *p, int errnum, const char *msg, ...)
{
    va_list args;
    va_start(args, msg);
    fprintf(stderr, "自定义错误: ");
    vfprintf(stderr, msg, args);
    va_end(args);
    return 0;                   // 返回0表示处理成功
}

// 创建 IPSet，如果它不存在
int create_ipset(char *set_name)
{
    struct ipset *ipset = ipset_init();
    if (!ipset) {
        fprintf(stderr, "Failed to initialize IPSet\n");
        return -1;
    }

    ipset_load_types();

    struct ipset_session *session = ipset_session(ipset);
    if (!session) {
        fprintf(stderr, "Failed to create IPSet session\n");
        ipset_fini(ipset);
        return -1;
    }

    // 设置自定义错误和输出处理函数
    if (ipset_custom_printf(ipset, custom_error_handler, NULL, custom_output_handler_, NULL) != 0) {
        fprintf(stderr, "设置自定义打印函数失败。\n");
        ipset_fini(ipset);
        return -1;
    }

    // 创建集合
    char *args[] = { "ipset", "create", set_name, "hash:ip", NULL };
    if (ipset_parse_argv(ipset, 4, args) != 0) {
        ipset_fini(ipset);
        return -1;
    }


    ipset_fini(ipset);

    return 0;
}

// 向指定的 ipset 添加 IP
int add_ip_to_ipset(char *set_name, char *ip)
{
    struct ipset *ipset = NULL;
    struct ipset_session *session = NULL;

    // 初始化 ipset 和 session
    ipset = ipset_init();
    if (!ipset) {
        fprintf(stderr, "初始化 IPSet 失败\n");
        return -1;              // 返回 -1，但不退出
    }

    ipset_load_types();

    session = ipset_session(ipset);
    if (!session) {
        fprintf(stderr, "创建 IPSet 会话失败\n");
        ipset_fini(ipset);
        return -1;              // 返回 -1，但不退出
    }
    // 设置 IPSet 名称
    if (ipset_session_data_set(session, IPSET_SETNAME, set_name) != 0) {
        fprintf(stderr, "设置 IPSet 名称失败\n");
        ipset_session_fini(session);
        ipset_fini(ipset);
        return -1;              // 返回 -1，但不退出
    }

    // 设置自定义错误和输出处理函数
    if (ipset_custom_printf(ipset, custom_error_handler, NULL, custom_output_handler_, NULL) != 0) {
        fprintf(stderr, "设置自定义打印函数失败。\n");
        ipset_fini(ipset);
        return -1;
    }

    // 将ip添加到集合
    char *args[] = { "ipset", "add", set_name, ip, NULL };
    if (ipset_parse_argv(ipset, 4, args) != 0) {
        ipset_fini(ipset);
        return -1;
    }


    ipset_fini(ipset);

    return 0;                   // 始终返回 0，表示执行成功
}

// 定义一个函数来清空指定名称的 ipset 集合
int flush_ipset(char *set_name)
{
    struct ipset *ipset = ipset_init();
    if (!ipset) {
        fprintf(stderr, "Failed to initialize IPSet\n");
        return -1;
    }

    ipset_load_types();

    // 设置自定义错误和输出处理函数
    if (ipset_custom_printf(ipset, custom_error_handler, NULL, custom_output_handler_, NULL) != 0) {
        fprintf(stderr, "设置自定义打印函数失败。\n");
        ipset_fini(ipset);
        return -1;
    }

    // 清空集合
    char *args[] = { "ipset", "flush", set_name, NULL };
    if (ipset_parse_argv(ipset, 3, args) != 0) {
        ipset_fini(ipset);
        return -1;
    }

    printf("IPSet %s flushed successfully\n", set_name);
    ipset_fini(ipset);
    return 0;
}

// 获取指定 IPSet 中的 IP 数量
int get_ip_count_in_ipset(char *set_name)
{
    int ip_count = 0;
    struct ipset *ipset = ipset_init();
    if (!ipset) {
        fprintf(stderr, "初始化 ipset 失败。\n");
        return -1;
    }

    ipset_load_types();

    // 设置自定义错误和输出处理函数
    if (ipset_custom_printf(ipset, custom_error_handler, NULL, custom_output_handler, &ip_count) != 0) {
        fprintf(stderr, "设置自定义打印函数失败。\n");
        ipset_fini(ipset);
        return -1;
    }

    // 列出集合
    char *args[] = { "ipset", "list", set_name, NULL };
    if (ipset_parse_argv(ipset, 3, args) != 0) {
        ipset_fini(ipset);
        return -1;
    }

    // 释放资源
    ipset_fini(ipset);
    return ip_count;
}

/*
int main()
{
    int r;
    char *set_name = "root";
    char *ip = "1.1.1.2";

    // 确保 IPSet 已存在
    r = create_ipset(set_name);
    printf("create_ipset %d\n", r);

    r = flush_ipset(set_name);
    printf("flush_ipset %d\n", r);

    // 尝试添加 IP
    r = add_ip_to_ipset(set_name, ip);
    printf("add_ip_to_ipset %d\n", r);

    // 获取并打印 IPSet 中的 IP 数量
    int count = get_ip_count_in_ipset(set_name);
    if (count >= 0) {
        printf("IPSet %s 中的 IP 数量: %d\n", set_name, count);
    }

    return 0;
}
*/
