#!/usr/bin/env python3
from pathlib import Path
import sys

root = Path(__file__).resolve().parents[1]
main_c = (root / "src" / "friidump.c").read_text(encoding="utf-8")
rawio_c = (root / "src" / "linux_rawio.c").read_text(encoding="utf-8")
dvd_drive_c = (root / "libfriidump" / "dvd_drive.c").read_text(encoding="utf-8")
dumper_c = (root / "libfriidump" / "dumper.c").read_text(encoding="utf-8")
windows_utils_c = (root / "libfriidump" / "xbox_ref" / "utils.c").read_text(encoding="utf-8")
cmake = (root / "CMakeLists.txt").read_text(encoding="utf-8")
linux_doc = (root / "docs" / "LINUX.md").read_text(encoding="utf-8")
helper = (root / "validation" / "friidump-linux-rawio-capability.sh").read_text(encoding="utf-8")
validator = (
    root
    / "validation"
    / "friidump-v0.5.3.16-pf1-candidate21-linux-live-validation.sh"
).read_text(encoding="utf-8")

checks = {
    "runtime reads CapEff": 'strncmp(line, "CapEff:", 7)' in rawio_c,
    "CAP_SYS_RAWIO bit is explicit": "FRIIDUMP_LINUX_CAP_SYS_RAWIO 17" in (root / "src" / "linux_rawio.h").read_text(encoding="utf-8"),
    "vendor path has runtime preflight": "friidump_linux_rawio_preflight" in main_c,
    "root execution is refused": "refuses this Linux vendor-command path while running as root" in main_c,
    "missing capability is explained": "Linux vendor-command authorization is unavailable" in main_c,
    "build emits raw-I/O warning": "Linux vendor-command paths require CAP_SYS_RAWIO" in cmake,
    "helper installs exact file capability": "sudo setcap cap_sys_rawio=ep" in helper,
    "helper verifies capability": "FRIIDUMP LINUX RAW-I/O CAPABILITY INSTALL: PASS" in helper,
    "helper warns rebuild clears capability": "rebuilding, replacing, copying, or re-extracting" in helper,
    "validator has capability phase": "capability_phase" in validator,
    "validator normalizes future timestamps": "Future source timestamp preflight" in validator,
    "preflight note buffer covers long executable paths": "char note[1536]" in main_c,
    "fallback executable path is bounded without snprintf": "fallback_dir" in main_c and "suffix_len" in main_c,
    "Linux documentation names CAP_SYS_RAWIO": "CAP_SYS_RAWIO" in linux_doc,
    "Linux documentation forbids whole-process sudo": "Do not run FriiDump itself with `sudo`" in linux_doc,
    "Linux media cycle releases door lock": "CDROM_LOCKDOOR, locked ? 1 : 0" in dvd_drive_c and "dvd_set_door_lock (dvd, false)" in dvd_drive_c,
    "Linux media cycle restores door lock": "dvd_set_door_lock (dvd, true)" in dvd_drive_c,
    "Linux media-cycle failure remains recoverable": "the door remains unlocked for recovery" in dvd_drive_c,
    "Linux documentation explains software tray cycle": "CDROM_LOCKDOOR" in linux_doc and "software tray cycle" in linux_doc,
    "Linux Xbox handshake uses explicit SG_IO": "#include <scsi/sg.h>" in dvd_drive_c and "io.interface_id = 'S'" in dvd_drive_c and "ioctl (dvd -> fd, SG_IO, &io)" in dvd_drive_c,
    "Linux Xbox handshake preserves explicit CDB lengths": "io.cmd_len = (unsigned char) cdb_len" in dvd_drive_c and '"9-mode-select-sticky-descrambling"' in dvd_drive_c,
    "Linux Xbox handshake preserves Windows timeouts": "120000" in dvd_drive_c and "10000" in dvd_drive_c,
    "Linux Xbox handshake emits transport diagnostics": "[XBOX-SGIO] step=%s" in dvd_drive_c and "host=0x%04X" in dvd_drive_c and "driver=0x%04X" in dvd_drive_c,
    "Linux media-cycle evidence reaches persistent log": 'xbox_ref_log_fprintf (stderr, "[XBOX] Linux media-cycle released' in dvd_drive_c and 'xbox_ref_log_fprintf (stderr, "[XBOX] Linux media-cycle restored' in dvd_drive_c,
    "generic RecoveryKick removed": "RecoveryKick(" not in windows_utils_c and "recovery_kick" not in dvd_drive_c and "recovery_kick" not in dumper_c,
    "Windows state sequence ported": "dvd_xbox_prepare_game_view" in dvd_drive_c and "Entry state appears locked/video; attempting the full handshake directly without a media transition" in dvd_drive_c,
    "Windows refresh cadence exact": "dvd_refresh_volume (dvd);" in dvd_drive_c and "dvd_sleep_ms (2000);" in dvd_drive_c and "dvd_wait_ready (dvd, 30000)" in dvd_drive_c,
    "single tray-cycle recovery": "performing one tray-cycle recovery and retry" in dvd_drive_c and "dvd_media_cycle (dvd, NULL)" in dvd_drive_c,
    "portable dumper uses shared Windows sequence": dumper_c.count("disc_xbox_prepare_game_view") >= 2 and "Windows sequence 1/4" in dumper_c and "Windows sequence 4/4" in dumper_c,
}

failed = []
for label, ok in checks.items():
    print(f"{'PASS' if ok else 'FAIL'}: {label}")
    if not ok:
        failed.append(label)

if failed:
    raise SystemExit("Linux raw-I/O contract failed: " + ", ".join(failed))

print("LINUX RAW-I/O SOURCE/DOCUMENTATION CONTRACT: PASS")
