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

ROOT = Path(__file__).resolve().parents[1]
DISC_C = (ROOT / "libfriidump" / "disc.c").read_text(encoding="utf-8")
DISC_H = (ROOT / "libfriidump" / "disc.h").read_text(encoding="utf-8")
DVD_C = (ROOT / "libfriidump" / "dvd_drive.c").read_text(encoding="utf-8")
DVD_H = (ROOT / "libfriidump" / "dvd_drive.h").read_text(encoding="utf-8")
MAIN_C = (ROOT / "src" / "friidump.c").read_text(encoding="utf-8")

checks = {
    "always-visible seed diagnostic prefix": '[SEED-DIAG]' in DISC_C,
    "seed block and sector evidence": 'seed_block_index' in DISC_H and 'sector_start' in DISC_H and 'sector_end' in DISC_H,
    "retry evidence": 'int retry;' in DISC_H,
    "prefetch stage": 'stage=prefetch' in DISC_C,
    "streaming stage": '"streaming-read"' in DISC_C,
    "header memdump stage": '"header-memdump"' in DISC_C,
    "EDC memdump stage": '"edc-memdump"' in DISC_C,
    "EDC validation stage": '"edc-unscramble-validation"' in DISC_C,
    "split recovery stages": '"split-streaming-read"' in DISC_C and '"split-header-memdump"' in DISC_C and '"split-edc-memdump"' in DISC_C,
    "transport command snapshot type": 'dvd_command_diagnostic' in DVD_H,
    "transport result capture": 'transport_result' in DVD_C,
    "Linux errno and SCSI evidence": 'saved_errno' in DVD_C and 'cgc.stat' in DVD_C and 'sense.sense_key' in DVD_C,
    "Windows status and sense evidence": 'sptd -> ScsiStatus' in DVD_C and 'win_error' in DVD_C,
    "public seed diagnostic getter": 'disc_get_seed_diagnostic' in DISC_H and 'disc_get_seed_diagnostic' in DISC_C,
    "final seed diagnostic summary": 'Seed diagnostic final failure:' in MAIN_C,
    "native report diagnostic note": 'Seed diagnostic: block %u/20' in MAIN_C,
    "STOP UNIT after seed failure": 'STOP UNIT / spin-down after seed failure' in MAIN_C,
    "STOP UNIT result note": 'STOP UNIT after seed failure succeeded.' in MAIN_C,
}

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

if failed:
    raise SystemExit("SEED DIAGNOSTICS CONTRACT: FAIL: " + ", ".join(failed))

print("SEED DIAGNOSTICS CONTRACT: PASS")
