# -*- coding: utf-8 -*-
"""tests.regression.test_collector_action_trigger — task-2636.

Spec: memory/specs/system_callback_collector_canonical_root_spec_260523.md §5.2, §8.
"""
from __future__ import annotations

import json
from pathlib import Path

import pytest

from utils.anu_collector_action_trigger import (
    REASON_INVALID_ENVELOPE,
    REASON_NORMAL_CALLBACK,
    REASON_NOT_REGISTERED,
    REASON_REGISTER_FAILED,
    REASON_SENDFILE_ONLY,
    REASON_SKIPPED,
    enqueue_collector_action,
    is_callback_action_trigger,
)


FIXTURE_ROOT = (
    Path(__file__).resolve().parent.parent
    / "fixtures"
    / "callback_collector_canonical_root"
)


def _envelope(scenario: str):
    base = FIXTURE_ROOT / scenario / "evidence.json"
    return json.loads(base.read_text(encoding="utf-8"))["envelope"]


def test_normal_callback_is_trigger():
    env = _envelope("normal_callback_is_trigger")
    assert is_callback_action_trigger(env) is True


def test_sendfile_only_is_not_trigger():
    env = _envelope("sendfile_only_not_trigger")
    assert is_callback_action_trigger(env) is False


def test_not_registered_is_not_trigger():
    env = {
        "task_id": "t",
        "registration_result_status": "NOT_REGISTERED",
        "delivery_method": "anu_cron_callback",
    }
    assert is_callback_action_trigger(env) is False


def test_register_failed_is_not_trigger():
    env = {
        "task_id": "t",
        "registration_result_status": "REGISTER_FAILED",
        "delivery_method": "anu_cron_callback",
    }
    assert is_callback_action_trigger(env) is False


def test_registered_but_wrong_delivery_method_is_not_trigger():
    env = {
        "task_id": "t",
        "registration_result_status": "REGISTERED",
        "delivery_method": "sendfile_only",
    }
    assert is_callback_action_trigger(env) is False


def test_non_dict_envelope_is_not_trigger():
    assert is_callback_action_trigger(None) is False
    assert is_callback_action_trigger("string") is False
    assert is_callback_action_trigger([1, 2, 3]) is False


def test_legacy_registration_status_alias_supported():
    # When only the legacy alias is set, the trigger decision must still hold.
    env = {
        "task_id": "t",
        "registration_status": "REGISTERED",  # legacy alias
        "delivery_method": "anu_cron_callback",
    }
    assert is_callback_action_trigger(env) is True


def test_enqueue_normal_callback_pushes_record():
    env = _envelope("normal_callback_is_trigger")
    queue = []
    record = enqueue_collector_action(env, queue=queue)
    assert record["is_trigger"] is True
    assert record["enqueued"] is True
    assert record["reason"] == REASON_NORMAL_CALLBACK
    assert record["task_id"] == env["task_id"]
    assert record["registration_result_status"] == "REGISTERED"
    assert len(queue) == 1
    assert queue[0] is record


def test_enqueue_sendfile_only_does_not_push():
    env = _envelope("sendfile_only_not_trigger")
    queue = []
    record = enqueue_collector_action(env, queue=queue)
    assert record["is_trigger"] is False
    assert record["enqueued"] is False
    assert record["reason"] == REASON_SENDFILE_ONLY
    assert queue == []


def test_enqueue_not_registered_does_not_push():
    env = {
        "task_id": "t",
        "registration_result_status": "NOT_REGISTERED",
        "delivery_method": "anu_cron_callback",
    }
    queue = []
    record = enqueue_collector_action(env, queue=queue)
    assert record["enqueued"] is False
    assert record["reason"] == REASON_NOT_REGISTERED
    assert queue == []


def test_enqueue_register_failed_does_not_push():
    env = {
        "task_id": "t",
        "registration_result_status": "REGISTER_FAILED",
        "delivery_method": "anu_cron_callback",
    }
    queue = []
    record = enqueue_collector_action(env, queue=queue)
    assert record["enqueued"] is False
    assert record["reason"] == REASON_REGISTER_FAILED
    assert queue == []


def test_enqueue_skipped_does_not_push():
    env = {
        "task_id": "t",
        "registration_result_status": "SKIPPED_WITH_EXPLICIT_REASON",
        "delivery_method": "none",
    }
    queue = []
    record = enqueue_collector_action(env, queue=queue)
    assert record["enqueued"] is False
    assert record["reason"] == REASON_SKIPPED


def test_enqueue_invalid_envelope():
    record = enqueue_collector_action(None, queue=[])
    assert record["is_trigger"] is False
    assert record["reason"] == REASON_INVALID_ENVELOPE


def test_enqueue_without_queue_returns_record_but_does_not_crash():
    env = _envelope("normal_callback_is_trigger")
    record = enqueue_collector_action(env, queue=None)
    assert record["is_trigger"] is True
    assert record["enqueued"] is False  # no queue → cannot push


@pytest.mark.parametrize(
    "scenario,expected_trigger",
    [
        ("canonical_root_explicit", True),
        ("canonical_root_missing_default", True),
        ("canonical_root_wrong_absolute", True),
        ("relative_paths_resolve_correctly", True),
        ("absolute_paths_passthrough", True),
        ("cwd_in_autoset_canonical_in_workspace", True),
        ("sendfile_only_not_trigger", False),
        ("normal_callback_is_trigger", True),
    ],
)
def test_fixture_trigger_matrix(scenario, expected_trigger):
    env = _envelope(scenario)
    assert is_callback_action_trigger(env) is expected_trigger
