/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */

#include <jni.h>

#include <aws/common/system_info.h>

#include "crt.h"
#include "java_class_ids.h"

JNIEXPORT
jint JNICALL Java_software_amazon_awssdk_crt_SystemInfo_processorCount(JNIEnv *env, jclass cls) {
    (void)cls;
    aws_cache_jni_ids(env);

    return (jint)aws_system_info_processor_count();
}

JNIEXPORT
jshort JNICALL Java_software_amazon_awssdk_crt_SystemInfo_cpuGroupCount(JNIEnv *env, jclass cls) {
    (void)cls;
    aws_cache_jni_ids(env);

    return aws_get_cpu_group_count();
}

JNIEXPORT
jobjectArray JNICALL
    Java_software_amazon_awssdk_crt_SystemInfo_cpuInfoForGroup(JNIEnv *env, jclass cls, jshort groupIdx) {
    (void)cls;
    aws_cache_jni_ids(env);

    size_t cpu_count = aws_get_cpu_count_for_group(groupIdx);

    struct aws_cpu_info *cpu_info = aws_mem_calloc(aws_default_allocator(), cpu_count, sizeof(struct aws_cpu_info));
    AWS_FATAL_ASSERT(cpu_info && "allocation failed in Java_software_amazon_awssdk_crt_SystemInfo_getCpuIdsForGroup");

    aws_get_cpu_ids_for_group(groupIdx, cpu_info, cpu_count);

    jobjectArray cpu_info_array =
        (*env)->NewObjectArray(env, (jsize)cpu_count, cpu_info_properties.cpu_info_class, NULL);

    for (size_t i = 0; i < cpu_count; ++i) {
        jobject cpu_info_obj = (*env)->NewObject(
            env,
            cpu_info_properties.cpu_info_class,
            cpu_info_properties.cpu_info_constructor,
            cpu_info[i].cpu_id,
            cpu_info[i].suspected_hyper_thread);
        (*env)->SetObjectArrayElement(env, cpu_info_array, (jsize)i, cpu_info_obj);
        (*env)->DeleteLocalRef(env, cpu_info_obj);
    }

    aws_mem_release(aws_default_allocator(), cpu_info);

    return cpu_info_array;
}
