#pragma once

// process_state_machine — logica pura de transiciones de un proceso async
// (idle/running/success/error) a partir de eventos. Sin threads, sin I/O.
//
// Diseñada para que `process_runner` (impuro, threads + popen) delegue las
// transiciones aqui y la UI/CLI puedan razonar sobre el estado sin depender
// de la implementacion concreta del runner.

namespace fn_ui {

enum class ProcessState {
    Idle,
    Running,
    Success,
    Error,
};

enum class ProcessEvent {
    Trigger,   // se solicita lanzar (no cambia estado por si solo)
    Spawned,   // el proceso/task realmente arranco
    Finished,  // termino con exito
    Failed,    // termino con error
    Timeout,   // se cancelo por timeout (-> Error)
    Reset,     // limpiar a Idle (solo desde Success/Error)
};

// Pura: dado (state, event) devuelve el nuevo estado. Transiciones invalidas
// devuelven el mismo estado sin mutar.
ProcessState process_transition(ProcessState s, ProcessEvent e);

// Nombres legibles para logs/UI (sin alocar — punteros a literales staticos).
const char* process_state_name(ProcessState s);
const char* process_event_name(ProcessEvent e);

} // namespace fn_ui
