# -*- coding: utf-8 -*-
"""tests.regression.dispatch_gate.test_prompt_4096_silent_drop — §17.16 regression.

회장 verbatim 박제: 673AA5A6 (task-2644 1차 dispatch.py wrap 약 6-8KB 추정
→ dev1 spawn 0 silent drop). 4096 cokacdir channel absolute limit 초과 시
CHANNEL_ABSOLUTE_OVERFLOW 로 dispatch.py 차단해야 함.
"""
from __future__ import annotations

import json
from pathlib import Path

from utils.prompt_byte_classifier import (
    CHANNEL_ABSOLUTE_OVERFLOW,
    COKACDIR_CHANNEL_ABSOLUTE_LIMIT,
    classify_prompt_bytes,
    is_allowed,
)
from utils.dispatch_spawn_verifier import (
    SpawnSignals,
    evaluate_signals,
    is_silent_drop_confirmed,
)
from utils.dispatch_status_enum import DISPATCH_SILENT_DROP_HOLD


FIXTURE_PROMPT = (
    Path(__file__).parent.parent.parent
    / "fixtures"
    / "dispatch_gate"
    / "prompt_4096_plus_silent_drop.json"
)
FIXTURE_SPAWN = (
    Path(__file__).parent.parent.parent
    / "fixtures"
    / "dispatch_gate"
    / "spawn_silent_drop.json"
)


def test_4096_plus_prompt_blocked_at_classifier() -> None:
    fix = json.loads(FIXTURE_PROMPT.read_text())
    n = fix["input"]["prompt_byte_length"]
    assert n == 4097
    assert n > COKACDIR_CHANNEL_ABSOLUTE_LIMIT

    prompt = "x" * n
    c = classify_prompt_bytes(prompt)
    assert c.verdict == CHANNEL_ABSOLUTE_OVERFLOW
    assert c.channel_overflow is True
    assert c.hard_block is True
    assert c.allowed is False
    assert is_allowed(prompt) is False


def test_4096_plus_wrap_estimate_6500_blocked_chair_incident_replay() -> None:
    """673AA5A6 박제 — wrap prompt 약 6500 bytes 추정 / 차단되어야 함."""
    fix = json.loads(FIXTURE_PROMPT.read_text())
    n = fix["input"]["alternative_byte_length"]
    assert n == 6500
    c = classify_prompt_bytes("y" * n)
    assert c.verdict == CHANNEL_ABSOLUTE_OVERFLOW
    assert c.allowed is False


def test_673aa5a6_silent_drop_fixture_settles_to_hold() -> None:
    fix = json.loads(FIXTURE_SPAWN.read_text())
    s = SpawnSignals(**fix["input"]["signals"])
    r = evaluate_signals(fix["input"]["cron_id"], s)
    assert r.silent_drop is True
    assert is_silent_drop_confirmed(r) is True
    assert r.next_status == DISPATCH_SILENT_DROP_HOLD
