# -*- coding: utf-8 -*-
"""
Tests for AR88-INTERNAL-AUTONOMY-02:
Integration of legitimate internal functional failure into SelfRepairEngine diagnostics
without fabricating data, without automated patch generation/promotion, and without touching production.
"""
import os
import sys
import pytest

WS = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
if WS not in sys.path:
    sys.path.insert(0, WS)

from app.remediation.self_repair.functional_assessor import (
    FunctionalAssessmentStatus,
    FunctionalEvaluationResult,
)
from app.remediation.self_repair.functional_diagnostic_adapter import (
    FunctionalDiagnosticAdapter,
    _compute_sha256,
)
from app.remediation.self_repair.engine import SelfRepairEngine
from app.remediation.self_repair.schemas import IncidentFailureType


def test_engine_processes_legitimate_internal_incident_safely():
    """
    Verifies that a legitimate internal functional failure passes through
    SelfRepairEngine.process_incident() safely:
    - Tracing and root cause analysis identify the exact defect.
    - Proposal restricts execution authority (production_write_authority=False, auto_promotion=False).
    - No repair or promotion is executed.
    """
    target_rel = "app/remediation/self_repair/circuit.py"
    target_abs = os.path.join(WS, target_rel)
    target_hash = _compute_sha256(target_abs)

    eval_result = FunctionalEvaluationResult(
        contract_id="contract_circuit_tracer_downstream_break",
        component_name="CircuitTracer",
        target_file_rel=target_rel,
        file_sha256=target_hash,
        status=FunctionalAssessmentStatus.FAIL,
        duration_ms=42.0,
        assertion_error="AssertionError: effector expected NOT_REACHED, got CircuitStatus.UNKNOWN",
        stack_trace="Traceback (most recent call last):\n  File 'test.py', line 15\nAssertionError: ...",
        stdout="[TEST] contract_circuit_tracer_downstream_break failed downstream check",
    )

    # 1. Validate & convert via adapter
    valid, reason, result_tuple = FunctionalDiagnosticAdapter.validate_and_convert_failure(eval_result, WS)
    assert valid, f"Conversion failed: {reason}"
    assert result_tuple is not None
    event, incident, evidence = result_tuple

    # 2. Initialize engine in isolated test mode
    engine = SelfRepairEngine(project_root=WS, base_reports_dir=os.path.join(WS, "reports", "test_runs"))

    # 3. Process incident through engine diagnostic flow
    inc, ev, trace, root_cause, proposal = engine.process_incident(
        failure_type=incident.failure_type,
        observed_symptom=incident.observed_symptom,
        source_component=incident.source_component,
        initial_evidence=incident.initial_evidence,
        source_files=[target_rel],
        workspace_root=WS,
        persist_artifacts=False,
    )

    # 4. Verify diagnostic results
    assert inc.incident_id.startswith("inc_")
    assert inc.source_component == "CircuitTracer"
    assert trace is not None
    assert root_cause.responsible_function == "CircuitTracer.trace"
    assert root_cause.confidence == "HIGH"
    assert root_cause.proven is True

    # 5. Verify strict safety containment
    assert proposal.repair_authorized is True  # Proposal generated for sandbox
    assert proposal.production_write_authority is False  # Never granted
    assert proposal.core_write_authority is False  # Never granted
    assert proposal.auto_promotion is False  # Never granted
    assert proposal.sandbox_contract != {}
    assert proposal.files_allowed == [target_rel]


def test_engine_refuses_to_diagnose_arbitrary_unauthorized_incident():
    """
    Confirms adapter will not produce valid incident/evidence for an unregistered contract,
    preventing arbitrary or synthetic contract failures from entering the engine.
    """
    eval_result = FunctionalEvaluationResult(
        contract_id="contract_fake_synthetic_mission_001",
        component_name="CircuitTracer",
        target_file_rel="app/remediation/self_repair/circuit.py",
        file_sha256=_compute_sha256(os.path.join(WS, "app/remediation/self_repair/circuit.py")),
        status=FunctionalAssessmentStatus.FAIL,
        duration_ms=10.0,
        assertion_error="Synthetic failure",
    )

    valid, reason, result_tuple = FunctionalDiagnosticAdapter.validate_and_convert_failure(eval_result, WS)
    assert not valid
    assert "REJECTED_UNAUTHORIZED_CONTRACT" in reason
    assert result_tuple is None
