#include <stddef.h>   // pentru NULL
#include "uart.h"     // pentru uart_puts
#include "task.h"
#include "switch.h"
#include "mmu.h"
#include "pmm.h"

void scheduler_yield(void) {
    int cid = 0;  // pentru sistem single-core sau SMP cu get_core_id()

    task_t* current = current_task[cid];

    // Caută următorul task READY
    for (int i = 1; i <= task_count; i++) {
        int next_id = (current ? current->id : -1) + i;
        if (next_id >= task_count) next_id -= task_count;

        if (tasks[next_id].state == TASK_READY) {
            task_t* next = &tasks[next_id];

            if (current && current->state == TASK_RUNNING)
                current->state = TASK_READY;

            next->state = TASK_RUNNING;
            current_task[cid] = next;

            if (current)
                context_switch(&current->sp, next->sp);  // înlocuiește stiva

            else {
                // First task ever - nu avem de salvat SP
                context_switch(NULL, next->sp);
            }

            // dacă context_switch revine, înseamnă că am greșit
            while (1) {}  // shouldn't return
        }
    }

    // Dacă nu am găsit task valid
    while (1) {
        uart_puts("[scheduler_yield] No READY task\n");
    }
}
