"""Smoke test de la rescue ladder (3 QC + 3 MASTER + Telegram SOS).

Forzamos que el supervisor SIEMPRE rechace la estación 'descargar' para que la
escalera se dispare hasta el final, y verificamos:
  - 1 intento estándar
  - 3 hipótesis QC en serie (todas FAIL)
  - 3 hipótesis MASTER en serie (todas FAIL)
  - Telegram SOS — en dry mode deja marker file _telegram_SOS_descargar.txt
  - caja.sections._rescue_descargar contiene el dossier completo
"""
from __future__ import annotations
import json
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent))
import orchestrator_v2 as o

# Monkey-patch: que el supervisor de descargar siempre devuelva BREAK
_original_audit = o.Supervisor.audit
def _always_break_for_descargar(self, caja):
    if self.station_id == 'descargar':
        return ('BREAK_FORCED_FOR_TEST', 'monkeypatch · simula sub-agente que no resuelve nunca')
    return _original_audit(self, caja)
o.Supervisor.audit = _always_break_for_descargar

# Run flow descargar standalone con caja fake
inbox = {
    'product': 'TestRescue',
    'video_url': 'https://example.com/fake.mp4',
    'timestamp': '2026-05-09T21-30-00Z',
    'flow': 'escalado_formatos',
}
flow_id = 'TEST_RESCUE_LADDER'
run_dir = o.RUNS_DIR / flow_id
if run_dir.exists():
    import shutil
    shutil.rmtree(run_dir)
run_dir.mkdir(parents=True, exist_ok=True)
caja = o.Caja(flow_id, run_dir, inbox)
meta = o.load_meta()
station_descargar = next(s for s in meta['stations'] if s['id'] == 'descargar')

ok, msg = o.run_with_rescue_ladder(caja, station_descargar, dry_run=True, bridge=None)

print('=' * 70)
print(f'RESCUE RESULT · ok={ok}')
print(f'msg: {msg}')
print('=' * 70)

dossier = caja.read_section('_rescue_descargar')
print('\n_rescue_descargar dossier:')
print(json.dumps(dossier, ensure_ascii=False, indent=2))

# Verificaciones
errors = []
if ok:
    errors.append('debería FAIL (forzado a BREAK siempre)')
if not dossier:
    errors.append('falta _rescue_descargar en caja')
else:
    if dossier.get('level_resolved') is not None:
        errors.append(f"level_resolved debería ser None, es {dossier.get('level_resolved')}")
    if len(dossier.get('qc_attempts', [])) != 3:
        errors.append(f"qc_attempts debería tener 3, tiene {len(dossier.get('qc_attempts', []))}")
    if len(dossier.get('master_attempts', [])) != 3:
        errors.append(f"master_attempts debería tener 3, tiene {len(dossier.get('master_attempts', []))}")
    if not dossier.get('fer_pinged'):
        errors.append('fer_pinged debería ser True')

marker = run_dir / '_telegram_SOS_descargar.txt'
if not marker.exists():
    errors.append(f'falta marker telegram SOS: {marker}')
else:
    print(f'\n[OK] Marker telegram SOS escrito ({marker.stat().st_size} bytes)')

# Verificar diversidad de hipótesis (que sean 3 ideas raíz distintas)
if dossier:
    qc_ideas = {a['hypothesis']['idea'] for a in dossier.get('qc_attempts', [])}
    master_ideas = {a['hypothesis']['idea'] for a in dossier.get('master_attempts', [])}
    if len(qc_ideas) != 3:
        errors.append(f'qc ideas no son 3 distintas: {qc_ideas}')
    if len(master_ideas) != 3:
        errors.append(f'master ideas no son 3 distintas: {master_ideas}')
    overlap = qc_ideas & master_ideas
    if overlap:
        errors.append(f'master repite ideas de qc: {overlap}')

print('\n' + '=' * 70)
if errors:
    print('TEST FAIL:')
    for e in errors:
        print(f'  [FAIL] {e}')
    sys.exit(1)
print('TEST PASS · rescue ladder 3 QC + 3 MASTER + Telegram SOS funciona')
sys.exit(0)
