"""Task — tarea de larga duracion con seguimiento de progreso."""

from dataclasses import dataclass, field
from datetime import datetime, timezone

from task_status import TaskStatus


@dataclass
class Task:
    """Tarea de larga duracion con seguimiento de progreso.

    Attributes:
        task_id:         UUID que identifica la tarea de forma unica.
        task_type:       Tipo libre: "graph_build", "simulation", "report_generation", etc.
        status:          Estado actual del ciclo de vida (TaskStatus).
        created_at:      Timestamp de creacion (UTC).
        updated_at:      Timestamp de ultima actualizacion (UTC).
        progress:        Porcentaje de avance 0-100.
        message:         Mensaje de estado legible por el usuario.
        result:          Resultado serializado al completar, None si no ha completado.
        error:           Descripcion del error al fallar, None si no ha fallado.
        metadata:        Datos arbitrarios asociados a la tarea (parametros de entrada, etc.).
        progress_detail: Detalles granulares de progreso (etapa actual, items procesados, etc.).
    """

    task_id: str
    task_type: str
    status: TaskStatus
    created_at: datetime
    updated_at: datetime
    progress: int = 0
    message: str = ""
    result: dict | None = None
    error: str | None = None
    metadata: dict = field(default_factory=dict)
    progress_detail: dict = field(default_factory=dict)

    def to_dict(self) -> dict:
        """Serializa la tarea a dict con timestamps en formato ISO 8601.

        Returns:
            dict con todos los campos de la tarea listos para JSON.
        """
        return {
            "task_id": self.task_id,
            "task_type": self.task_type,
            "status": self.status.value,
            "created_at": self.created_at.isoformat(),
            "updated_at": self.updated_at.isoformat(),
            "progress": self.progress,
            "message": self.message,
            "result": self.result,
            "error": self.error,
            "metadata": self.metadata,
            "progress_detail": self.progress_detail,
        }
