"""Read-only isolation probes for the shipped 0.1.24 engine. No model repair."""
import json
import subprocess
from datetime import datetime
from pathlib import Path

LAB = Path(__file__).resolve().parents[1]
ROOT = LAB / 'evidence/chapter-11-diagnostics-2026-10-20'
ROOT.mkdir(parents=True, exist_ok=True)
PAYLOADS = ROOT / 'payloads'
PAYLOADS.mkdir(exist_ok=True)
CLI = LAB / 'tools/cli/Scripts/foggy-runtime.exe'
MODEL = 'ChinookInvoiceTimeQueryModel'
STAMP = datetime.now().astimezone().strftime('%Y%m%dT%H%M%S')
COMMANDS = []
CASES = []


def call(tag, args):
    command = [str(CLI), '--base-url', 'http://127.0.0.1:18067', '--namespace', 'chinook', *map(str, args)]
    path = ROOT / f'{STAMP}-{tag}.json'
    assert not path.exists()
    r = subprocess.run(command, capture_output=True, encoding='utf-8', timeout=60)
    path.write_text(r.stdout, encoding='utf-8')
    if r.stderr:
        path.with_suffix('.stderr.txt').write_text(r.stderr, encoding='utf-8')
    result = json.loads(r.stdout) if r.stdout.strip() else {}
    COMMANDS.append(dict(arguments=command, exitCode=r.returncode, response=str(path)))
    (ROOT / f'{STAMP}-commands.json').write_text(json.dumps(COMMANDS, ensure_ascii=False, indent=2), encoding='utf-8')
    print(json.dumps(dict(step=tag, exitCode=r.returncode, success=result.get('success'),
        error=(result.get('error') or {}).get('message', '')[:230],
        rows=len(result.get('data', {}).get('items', [])),
        sample=result.get('data', {}).get('items', [])[:2]), ensure_ascii=False), flush=True)
    return result, path


def probe(tag, payload, execute=True, explain=True):
    p = PAYLOADS / f'{tag}.json'
    p.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding='utf-8')
    v, vp = call(tag + '-validate', ['query', 'validate', MODEL, '--payload', p])
    case = dict(name=tag, payload=str(p), validation=str(vp), validationSuccess=v.get('success'))
    if v.get('success'):
        if explain:
            x, xp = call(tag + '-explain', ['query', 'explain', MODEL, '--payload', p, '--include-sql', '--include-physical-names', '--depth', 'detailed'])
            case.update(explain=str(xp), explainSuccess=x.get('success'))
        if execute:
            r, rp = call(tag + '-execute', ['query', 'execute', MODEL, '--payload', p])
            case.update(response=str(rp), executionSuccess=r.get('success'))
    CASES.append(case)
    (ROOT / 'diagnostic-manifest.json').write_text(json.dumps(dict(collectedAt=datetime.now().astimezone().isoformat(),
        model=MODEL, cases=CASES), ensure_ascii=False, indent=2), encoding='utf-8')


def main():
    caps, _ = call('capabilities', ['capabilities'])
    for n in ['models.describe', 'query.validate', 'query.execute', 'query.explain']:
        assert caps['data']['capabilities'][n] == 'supported'
    call('binding', ['datasources', 'binding', '--namespace', 'chinook'])
    call('datasource-test', ['datasources', 'test', 'chinook-sqlite'])
    d, _ = call('describe', ['models', 'describe', MODEL])
    assert {'invoiceDate$id', 'invoiceDate$yearMonth', 'invoiceAmount', 'invoiceId'} <= d['data']['data']['fields'].keys()

    original = json.loads((LAB / 'queries/chapter-11/01-monthly-totals.json').read_text(encoding='utf-8'))
    probe('01-monthly-control', original)
    scope = original['slice']
    window = [{'field': 'invoiceDate$yearMonth', 'dir': 'asc'}]
    detail = dict(columns=['invoiceId', 'invoiceAmount', 'previousAmount'], slice=scope,
        calculatedFields=[dict(name='previousAmount', expression='lag(invoiceAmount, 1)',
            windowOrderBy=[{'field': 'invoiceId', 'dir': 'asc'}])], orderBy=['invoiceId'], limit=100)
    probe('02-lag-detail', detail)
    for tag, expression in [('03-lag-group-measure','lag(invoiceAmount, 1)'),
                            ('04-lag-group-nested-sum','lag(sum(invoiceAmount), 1)'),
                            ('05-lag-group-alias','lag(totalAmount, 1)'),
                            ('06-rank-group','row_number()')]:
        p = json.loads(json.dumps(original))
        p['columns'].append('previousAmount')
        p['calculatedFields']=[dict(name='previousAmount', expression=expression, windowOrderBy=window)]
        probe(tag,p)

    for tag, src in [('07-time-yoy','probe-yoy.json'),('08-time-mom','probe-mom.json')]:
        p=json.loads((LAB/'queries/chapter-11'/src).read_text(encoding='utf-8'))
        probe(tag,p,execute=False)
    p=json.loads((LAB/'queries/chapter-11/probe-mom.json').read_text(encoding='utf-8'))
    p['columns'].insert(0,'invoiceDate$id')
    p['groupBy'].insert(0,'invoiceDate$id')
    probe('09-mom-extra-day-key-changes-grain',p,execute=False)

    p=json.loads(json.dumps(original))
    p['columns']+=['previousAmount','difference','changeRatio']
    p['calculatedFields']=[
        dict(name='previousAmount',expression='lag(invoiceAmount, 1)',windowOrderBy=window),
        dict(name='difference',expression='invoiceAmount - previousAmount'),
        dict(name='changeRatio',expression='(invoiceAmount - previousAmount) / nullif(previousAmount, 0)')]
    probe('10-lag-separate-calculations',p)
    p['columns']=p['columns'][:-3]+['difference']
    p['calculatedFields']=[dict(name='difference',expression='invoiceAmount - lag(invoiceAmount, 1)',windowOrderBy=window)]
    probe('11-lag-compound-no-sum',p)
    p=json.loads((PAYLOADS/'03-lag-group-measure.json').read_text(encoding='utf-8'))
    probe('12-lag-control-without-explain',p,explain=False)
    p['slice'][0]['value'][0]='2011-12-01'
    probe('13-lag-including-prior-december',p)
    call('datasource-diagnostics',['datasources','diagnostics'])


if __name__ == '__main__':
    main()
