import json
import os
import pathlib
import shutil
import stat
import subprocess
import tempfile

SRC = pathlib.Path('C:/MCSJAgent/foster-ask-michel/sal-phase3')
REPO = pathlib.Path('C:/Solutions/foster/hermes-agent')

def exe(path, text):
    path.write_text(text, encoding='utf-8', newline='\n')
    path.chmod(path.stat().st_mode | stat.S_IXUSR)

with tempfile.TemporaryDirectory(prefix='phase3-test-') as td:
    root = pathlib.Path(td)
    home = root / 'home'
    fake = root / 'bin'
    agent = home / 'hermes-agent'
    hermes_home = home / '.hermes'
    (home / '.ssh').mkdir(parents=True)
    fake.mkdir()
    (agent / 'tools').mkdir(parents=True)
    (agent / 'gateway/platforms').mkdir(parents=True)
    hermes_home.mkdir()
    (home / '.ssh/michel_windows_ed25519').write_text('fake-private-key')
    shutil.copy2(REPO / 'toolsets.py', agent / 'toolsets.py')
    shutil.copy2(REPO / 'gateway/platforms/webhook.py', agent / 'gateway/platforms/webhook.py')

    exe(fake / 'ssh-keyscan', '#!/bin/sh\necho "host ssh-ed25519 AAAATEST"\n')
    exe(fake / 'ssh-keygen', '#!/bin/sh\necho "256 SHA256:fRtAPoPhusxctqlacXUlrMLO7H+K66/nimb8ZPamShw host (ED25519)"\n')
    exe(fake / 'pgrep', '#!/bin/sh\nexit 1\n')
    exe(fake / 'systemctl', '#!/bin/sh\nexit 0\n')
    exe(fake / 'curl', '#!/bin/sh\necho "{\\"status\\":\\"ok\\"}"\n')
    exe(fake / 'hermes', '#!/bin/sh\nexit 0\n')
    exe(fake / 'sftp', '''#!/bin/sh
batch=""
while [ "$#" -gt 0 ]; do
  if [ "$1" = "-b" ]; then batch="$2"; shift 2; else shift; fi
done
out="$(awk 'NR==1 {print $3}' "$batch")"
printf '%064d' 7 > "$out"
''')

    env = os.environ.copy()
    env.update({
        'HOME': str(home),
        'PATH': str(fake) + os.pathsep + env['PATH'],
        'FOSTER_AGENT_DIR': str(agent),
        'FOSTER_HERMES_HOME': str(hermes_home),
    })
    proc = subprocess.run(
        ['bash', str(SRC / 'install.sh')],
        cwd=str(SRC), env=env, text=True, capture_output=True, timeout=60,
    )
    if proc.returncode:
        raise SystemExit(f'installer failed {proc.returncode}\nSTDOUT={proc.stdout}\nSTDERR={proc.stderr}')

    subs = json.loads((hermes_home / 'webhook_subscriptions.json').read_text())
    route = subs['michel-result']
    unit = (home / '.config/systemd/user/foster-michel-tunnel.service').read_text()
    toolsets = (agent / 'toolsets.py').read_text()
    webhook = (agent / 'gateway/platforms/webhook.py').read_text()
    assert route['deliver_only'] is True
    assert route['deliver'] == 'telegram'
    assert route['deliver_extra']['chat_id'] == '{origin.chat_id}'
    assert route['deliver_extra']['message_thread_id'] == '{origin.thread_id}'
    assert route['deliver_extra']['reply_to'] == '{origin.message_id}'
    assert 'ask_michel_verify' in toolsets
    assert 'reply_to = extra.get("reply_to") or None' in webhook
    assert '-R 127.0.0.1:18645:127.0.0.1:8765' in unit
    assert '-L 127.0.0.1:18644:127.0.0.1:8644' in unit
    assert (hermes_home / 'skills/ask-michel/SKILL.md').is_file()
    assert 'SAL_PHASE3_STATUS=SUCCESS' in proc.stdout
    print(json.dumps({
        'status': 'PASS',
        'subscription': 'michel-result',
        'dynamic_chat': True,
        'dynamic_thread': True,
        'reply_anchor': True,
        'native_tool_installed': True,
        'reverse_forward': '127.0.0.1:18645->127.0.0.1:8765',
        'request_forward_preserved': True,
    }))
