from __future__ import annotations
from affinity_sched.engine import affinity_engine as affinity


def group_create(name: str = "") -> int:
    """
    创建新组并返回组ID

    Returns:
        int: 新创建的组ID,如果创建失败返回-1

    Raises:
        RuntimeError: 当组创建失败时可能抛出异常
    """
    return affinity.task.group_create(name=name)


def group_destroy(group_id: int) -> None:
    """
    销毁指定组

    Args:
        group_id: 要销毁的组ID

    Returns:
        None: 不返回值

    Note:
        如果组不存在,静默返回(不抛异常)
    """
    affinity.task.destory_group(group_id=group_id)


def group_add_thread(
    group_id: int,
    tid: int | None = None,
    thread_name: str | None = None,
    pid: int | None = None,
    process_name: str | None = None,
) -> None:
    """
    将线程添加到指定任务组中。

    Args:
        group_id: 目标任务组的ID,必须是已存在的有效组ID。
        tid: 要添加的线程ID,必须是正在运行线程的有效TID。
        thread_name: 线程的唯一名称,用于标识和监控。

    Raises:
        当添加失败时抛出异常
    """
    affinity.task.group_add_thread(
        group_id=group_id, tid=tid, thread_name=thread_name, pid=pid, process_name=process_name
    )


def group_remove_thread(group_id: int, tid: int | None = None, thread_name: str | None = None) -> None:
    """
    从组中移除线程

    Args:
        group_id: 组ID
        tid: 线程ID
        thread_name: 线程名称

    Raises:
        当移除失败时抛出异常
    """
    affinity.task.group_remove_thread(group_id=group_id, tid=tid, thread_name=thread_name)


def group_add_process(
    group_id: int, pid: int | None = None, process_name: str | None = None, parent_name: str | None = None
) -> None:
    """
    将进程添加到指定任务组中。

    Args:
        group_id: 目标任务组的ID。必须是已存在的有效组ID。
        pid: 要添加的进程ID。必须是正在运行进程的有效PID。
        process_name: 进程的唯一名称。用于标识和监控。
        parent_name: 父进程的名称,用于在多个同名进程中过滤指定父进程的子进程。

    Raises:
        当添加失败时抛出异常
    """
    affinity.task.group_add_process(group_id=group_id, pid=pid, process_name=process_name, parent_name=parent_name)


def group_remove_process(
    group_id: int, pid: int | None = None, process_name: str | None = None, parent_name: str | None = None
) -> None:
    """
    从组中移除进程

    Args:
        group_id: 组ID
        pid: 进程ID
        process_name: 进程名称
        parent_name: 父进程的名称,用于在多个同名进程中过滤指定父进程的子进程。

    Raises:
        当移除失败时抛出异常
    """
    affinity.task.group_remove_process(group_id=group_id, pid=pid, process_name=process_name, parent_name=parent_name)


def thread_set_high_priority(
    tid: int | None = None, thread_name: str | None = None, pid: int | None = None, process_name: str | None = None
) -> None:
    """
    指定线程设置高优先级

    Args:
        tid: 线程ID
        thread_name: 线程名称

    Raises:
        当设置失败时抛出异常
    """
    affinity.task.thread_set_high_priority(tid=tid, thread_name=thread_name, pid=pid, process_name=process_name)


def process_bind_npu(
    npu_id: int, pid: int | None = None, process_name: str | None = None, parent_name: str | None = None
) -> None:
    """
    进程绑定NPU

    Args:
        npu_id: npu的id
        pid: 进程ID
        process_name: 进程名
        parent_name: 父进程的名称,用于在多个同名进程中过滤指定父进程的子进程。

    Raises:
        失败时抛出异常
    """
    affinity.task.process_bind_npu(npu_id=npu_id, pid=pid, process_name=process_name, parent_name=parent_name)


def run_affinity(dry_run: bool = False) -> None:
    """
    运行亲和调度

    Args:
        dry_run: True表示试运行,仅输出亲和方案,不做亲和方案执行;False表示运行亲和调度全流程
    """
    affinity.run(dry_run=dry_run)


def print_affinity() -> None:
    """
    打印亲和组中进程/线程当前实际的亲和信息
    """
    affinity.print_affinity()


def restore_affinity() -> None:
    """
    恢复亲合组中进程/线程原始的亲和信息
    """
    affinity.restore_affinity()


def set_exclude_cpu(cpu_str: str) -> None:
    """
    设置不参与亲和调度的cpu

    Args:
        cpu_str: 字符串格式的cpu列表,示例:0-3, 10, 20
    """
    affinity.config.set_exclude_cpu(cpu_str=cpu_str)