#!/usr/bin/env python3
from pathlib import Path
import argparse, subprocess, os, json, shutil, hashlib

LAB_ID='FND010-LAB1'
LAB_ROOT=Path(__file__).resolve().parent
OWNER_MARKER='.maknow_lab_workspace.json'
OWNER_SCHEMA='MAKNOW_LAB_WORKSPACE_OWNER_v1'
BEHAVIOR_TEST='from pathlib import Path\nimport sys\nsys.path.insert(0,str(Path(__file__).resolve().parents[1]))\nfrom service import parse_code\nassert parse_code("  a   b  ") == "A B", parse_code("  a   b  ")\nprint("PASS target behavior")\n'
BEHAVIOR_SHA256=hashlib.sha256(BEHAVIOR_TEST.encode('utf-8')).hexdigest()

def run(cmd,cwd,env=None,check=True):
    e=os.environ.copy(); e.update(env or {}); e.setdefault('PYTHONDONTWRITEBYTECODE','1')
    return subprocess.run(cmd,cwd=cwd,env=e,text=True,capture_output=True,check=check)

def git(args,cwd,env=None): return run(['git']+args,cwd,env)

def commit(repo,msg,stamp):
    env={'GIT_AUTHOR_NAME':'MAKNOW Fixture','GIT_AUTHOR_EMAIL':'fixture@example.invalid','GIT_COMMITTER_NAME':'MAKNOW Fixture','GIT_COMMITTER_EMAIL':'fixture@example.invalid','GIT_AUTHOR_DATE':stamp,'GIT_COMMITTER_DATE':stamp}
    git(['add','-A'],repo); git(['commit','-m',msg],repo,env)
    return git(['rev-parse','HEAD'],repo).stdout.strip()

def resolve_workspace(raw):
    p=Path(raw)
    ws=(p if p.is_absolute() else LAB_ROOT/p).resolve()
    root=LAB_ROOT.resolve()
    # Destructive fixture workspaces are intentionally restricted to direct children of the learner lab root.
    if ws==root or ws.parent!=root:
        raise SystemExit(f'unsafe workspace path rejected: {ws}; choose a direct child of {root}')
    if ws in {Path('/').resolve(),Path.home().resolve()}:
        raise SystemExit(f'unsafe workspace path rejected: {ws}')
    return ws

def marker_payload(ws):
    return {'schema':OWNER_SCHEMA,'lab_id':LAB_ID,'owner':'MAKNOW_FND010_LAB1','workspace_name':ws.name}

def verify_owned(ws):
    marker=ws/OWNER_MARKER
    if not marker.is_file(): return False
    try: data=json.loads(marker.read_text(encoding='utf-8'))
    except Exception: return False
    exp=marker_payload(ws)
    return all(data.get(k)==v for k,v in exp.items())

def main():
    ap=argparse.ArgumentParser()
    ap.add_argument('--workspace',default='workspace',help='Direct child name/path under this learner lab directory')
    ap.add_argument('--variant',choices=['primary','transfer'],default='primary')
    ap.add_argument('--force',action='store_true',help='Reset only a workspace already carrying this lab ownership marker')
    a=ap.parse_args()
    ws=resolve_workspace(a.workspace); repo=ws/'repo'
    if ws.exists():
        if not a.force:
            raise SystemExit(f'{ws} exists; no files were changed. Use --force only for an intentional reset of this lab-owned workspace.')
        if not verify_owned(ws):
            raise SystemExit(f'refusing destructive reset: {ws} is not an owned {LAB_ID} workspace')
        shutil.rmtree(ws)
    ws.mkdir(parents=False,exist_ok=False)
    (ws/OWNER_MARKER).write_text(json.dumps(marker_payload(ws),indent=2)+'\n',encoding='utf-8')
    repo.mkdir()
    git(['init','-b','main'],repo); git(['config','user.name','MAKNOW Learner'],repo); git(['config','user.email','learner@example.invalid'],repo)
    (repo/'service.py').write_text('def parse_code(value):\n    return value.strip().upper()\n',encoding='utf-8')
    (repo/'tests').mkdir(); (repo/'tests/test_behavior.py').write_text(BEHAVIOR_TEST,encoding='utf-8')
    (repo/'README.md').write_text('Synthetic local release-line fixture. No remote is configured.\n',encoding='utf-8')
    (repo/'.gitignore').write_text('__pycache__/\n*.pyc\n',encoding='utf-8')
    base0=commit(repo,'base: old normalization behavior','2026-01-01T00:00:00+00:00')
    (repo/'compatibility_note.txt').write_text('supported input may contain repeated internal spaces\n',encoding='utf-8')
    base1=commit(repo,'release: document repeated-space compatibility expectation','2026-01-02T00:00:00+00:00')
    tag_env={'GIT_COMMITTER_DATE':'2026-01-02T00:00:00+00:00'}
    run(['git','tag','-a','v1.4.0','-m','synthetic baseline v1.4.0',base1],repo,tag_env)
    if a.variant=='primary':
        git(['branch','release/1.4',base1],repo); target_ref='release/1.4'
    else:
        git(['branch','release/1.4-transfer',base0],repo); target_ref='release/1.4-transfer'
    (repo/'compat.py').write_text('def normalize_code(value):\n    return " ".join(value.split()).upper()\n',encoding='utf-8')
    refactor=commit(repo,'refactor: add normalization helper','2026-01-03T00:00:00+00:00')
    (repo/'service.py').write_text('from compat import normalize_code\n\ndef parse_code(value):\n    return normalize_code(value)\n',encoding='utf-8')
    bugfix=commit(repo,'fix: normalize repeated internal spaces','2026-01-04T00:00:00+00:00')
    git(['switch',target_ref],repo)
    if a.variant=='primary':
        (repo/'release_notes.txt').write_text('release/1.4 maintenance line\n',encoding='utf-8')
        target_tip=commit(repo,'release: maintenance note','2026-01-05T00:00:00+00:00')
    else:
        target_tip=git(['rev-parse','HEAD'],repo).stdout.strip()
    tag_env={'GIT_COMMITTER_DATE':'2026-01-06T00:00:00+00:00'}
    run(['git','tag','-a','v1.4.1-candidate','-m','candidate marker intentionally created before fix',target_tip],repo,tag_env)
    meta={'schema':'MAKNOW_FND010_FIXTURE_METADATA_v1','variant':a.variant,'repository_id':'fnd010-local-fixture','source_bugfix_commit':bugfix,'main_refactor_commit':refactor,'target_ref':target_ref,'target_tip_at_setup':target_tip,'baseline_tag':'v1.4.0','candidate_tag':'v1.4.1-candidate','semver_policy_declared':False,'public_api_declared':False,'remote_configured':False,'behavior_oracle_id':'FND010-ORACLE-TARGET-BEHAVIOR-v1','behavior_oracle_sha256':BEHAVIOR_SHA256,'workspace_owner_marker':OWNER_MARKER}
    (ws/'fixture_metadata.json').write_text(json.dumps(meta,indent=2)+'\n',encoding='utf-8')
    (ws/'external_state.marker').write_text('UNCHANGED_SYNTHETIC_EXTERNAL_STATE\n',encoding='utf-8')
    print(json.dumps(meta,indent=2))
if __name__=='__main__': main()
