"""
Impact analyzer for assessing change significance.

Implements FR-8: Impact Analysis
Stateless analyzer that computes change magnitude and decides
whether recomputation is warranted based on configurable thresholds.
"""

from typing import Optional

from markitect.prompts.incremental.metrics import calculate_change_magnitude
from markitect.prompts.incremental.models import RecomputeConfig


class ImpactAnalyzer:
    """
    Stateless impact analyzer for artifact changes.

    Computes change magnitude using diff metrics and compares against
    configurable thresholds to determine whether recomputation is needed.
    """

    def calculate_magnitude(
        self,
        old_content: Optional[str],
        new_content: Optional[str],
        method: str = "structural",
    ) -> float:
        """
        Calculate the magnitude of a change.

        Args:
            old_content: Previous content (None for creation)
            new_content: Current content (None for deletion)
            method: Diff method ("structural" or "line")

        Returns:
            Change magnitude from 0.0 to 1.0
        """
        return calculate_change_magnitude(old_content, new_content, method)

    def should_recompute(
        self,
        magnitude: float,
        config: RecomputeConfig,
    ) -> bool:
        """
        Determine whether a dependent should be recomputed based on magnitude.

        Args:
            magnitude: Change magnitude (0.0-1.0)
            config: Recompute configuration with threshold

        Returns:
            True if magnitude meets or exceeds threshold
        """
        return magnitude >= config.impact_threshold
