"""MemoryData — instancia concreta de un dato de memoria de agente."""

from __future__ import annotations

from dataclasses import dataclass, field
from datetime import datetime
from typing import Any


@dataclass
class MemoryData:
    """Instancia concreta de un dato de memoria.

    Los campos son dinamicos (dict) y se validan contra el MemoryTypeSchema
    correspondiente. Soporta 3 niveles de contenido para retrieval jerarquico:
        L0 abstract  — resumen corto (una linea).
        L1 overview  — resumen medio (parrafo).
        L2 content   — contenido completo (sin limite).

    Attributes:
        memory_type: tipo de memoria al que pertenece esta instancia.
        uri:         URI para identificar y localizar la instancia en updates.
        fields:      datos dinamicos del schema correspondiente.
        abstract:    L0 resumen corto para retrieval rapido.
        overview:    L1 resumen medio para contexto.
        content:     L2 contenido completo.
        name:        nombre legible de la instancia.
        tags:        etiquetas para filtrado y busqueda.
        created_at:  timestamp de creacion.
        updated_at:  timestamp de ultima actualizacion.
    """

    memory_type: str
    uri: str | None = None
    fields: dict[str, Any] = field(default_factory=dict)
    abstract: str | None = None
    overview: str | None = None
    content: str | None = None
    name: str | None = None
    tags: list[str] = field(default_factory=list)
    created_at: datetime | None = None
    updated_at: datetime | None = None

    def get_field(self, field_name: str) -> Any:
        """Retorna el valor de un campo dinamico por nombre.

        Args:
            field_name: nombre del campo a obtener.

        Returns:
            El valor del campo, o None si no existe.
        """
        return self.fields.get(field_name)

    def set_field(self, field_name: str, value: Any) -> None:
        """Establece el valor de un campo dinamico.

        Args:
            field_name: nombre del campo a establecer.
            value:      valor a asignar.
        """
        self.fields[field_name] = value
