package org.tzd.frida.windows;

/**
 * FridaThread 类继承自 {@link Thread}，用于封装与 Frida 相关的线程操作。
 * <p>此类用于创建并启动线程，以便在新的线程中执行与 Frida 相关的任务。</p>
 * <p>它允许在启动线程之前执行额外的操作，例如调用 `FridaRunnable` 的 `run` 方法来配置与 Frida 的交互。</p>
 *
 * @author tzdwindows 7
 */
public class FridaThread extends Thread {
    private boolean isStart = false;  // 用于标记线程是否已配置正确
    private final Frida frida;  // 与线程相关联的 Frida 实例

    /**
     * 构造一个新的 FridaThread 实例。
     * <p>该构造函数接受一个任务和一个 Frida 实例，创建一个线程并传入任务。</p>
     *
     * @param task 线程执行的任务，类型为 {@link Runnable}。
     * @param frida 与该线程关联的 {@link Frida} 实例。
     */
    public FridaThread(Runnable task, Frida frida) {
        super(task);  // 调用父类构造器
        this.frida = frida;
        setName("Frida Thread");  // 设置线程名称
    }

    /**
     * 执行与 Frida 相关的额外任务。
     * <p>此方法会执行传入的 {@link FridaRunnable} 任务，并传入当前的 Frida 实例。</p>
     *
     * @param runnable 执行任务的 {@link FridaRunnable} 实例。
     * @return 返回当前的 {@link FridaThread} 实例，以便链式调用。
     */
    public FridaThread execute(FridaRunnable runnable) {
        runnable.run(frida);  // 执行任务
        isStart = true;  // 标记线程配置完成
        return this;  // 返回当前线程实例
    }

    /**
     * 设置线程是否已经开始执行。
     * <p>此方法可用于手动控制线程的启动配置。</p>
     *
     * @param start 设置线程是否已配置完成。
     */
    public void setStart(boolean start) {
        isStart = start;
    }

    /**
     * 启动线程。
     * <p>重写了 `Thread` 类的 `start()` 方法，首先检查线程是否已正确配置。</p>
     * <p>如果未正确配置，则抛出一个运行时异常，避免线程未准备好就启动。</p>
     */
    @Override
    public void start() {
        if (!isStart) {
            throw new RuntimeException("Basic information is not configured");
        }
        super.start();  // 调用父类的 `start()` 方法启动线程
    }
}
