"""
MemoryReinforcement

Triggers memory reinforcement on recall and handles auto-reinforcement.
"""

from datetime import UTC, datetime
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from app.models.memory import UserMemory


class MemoryReinforcement:
    """Reinforce memories on recall to prevent forgetting."""

    MAX_FREQUENCY = 10
    AUTO_REINFORCE_BOOST = 1.1  # 10% boost per week

    def trigger(self, memory: "UserMemory") -> "UserMemory":
        """Called when memory is recalled: reset decay_score, increment frequency.

        This is the core reinforcement mechanism - each recall makes the memory
        stickier by resetting its decay curve and incrementing frequency.
        """
        from app.services.memory.forgetting_curve import ForgettingCurve

        # Increment frequency count (capped at MAX_FREQUENCY)
        current_freq = getattr(memory, "frequency_count", 0) or 0
        memory.frequency_count = min(current_freq + 1, self.MAX_FREQUENCY)

        # Update last accessed time
        now = datetime.now(UTC)
        memory.last_accessed_at = now
        memory.last_recalled_at = now

        # Reset decay score to near 1.0 (fully retained)
        curve = ForgettingCurve()
        memory.decay_score = min(0.95, curve.calculate_decay(memory) + 0.1)

        return memory

    def auto_reinforce(self, memories: list["UserMemory"]) -> list["UserMemory"]:
        """Weekly auto-reinforce for high-importance memories.

        Applies a 10% boost to frequency_count for high-importance memories
        that haven't been accessed recently, keeping them fresh.
        """
        reinforced = []
        now = datetime.now(UTC)

        for memory in memories:
            importance_level = getattr(memory, "importance_level", "medium") or "medium"
            if importance_level != "high":
                continue

            current_freq = getattr(memory, "frequency_count", 0) or 0
            if current_freq >= self.MAX_FREQUENCY:
                continue

            # Apply 10% boost, capped at MAX_FREQUENCY
            new_freq = min(int(current_freq * self.AUTO_REINFORCE_BOOST + 1), self.MAX_FREQUENCY)
            memory.frequency_count = new_freq

            # Slightly improve decay score
            current_decay = getattr(memory, "decay_score", 0.5) or 0.5
            memory.decay_score = min(0.95, current_decay * 1.05)

            memory.last_accessed_at = now
            reinforced.append(memory)

        return reinforced
