import hashlib
import hmac
import importlib.util
import json
import os
import tempfile
from pathlib import Path
from types import SimpleNamespace

from gateway.session_context import clear_session_vars, set_session_vars

PLUGIN = Path('C:/Solutions/foster/hermes-home/profiles/michel/plugins/michel-result-outbox/__init__.py')
spec = importlib.util.spec_from_file_location('michel_result_outbox_tested', PLUGIN)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)

with tempfile.TemporaryDirectory(prefix='michel-outbox-test-') as td:
    root = Path(td)
    secret = root / 'secret'
    outbox = root / 'outbox'
    secret.write_text('test-callback-secret-0123456789abcdef', encoding='ascii')
    os.environ['MICHEL_RESULT_SECRET_FILE'] = str(secret)
    os.environ['MICHEL_RESULT_OUTBOX'] = str(outbox)

    cases = [
        ('req-A', 'chat-A', 'thread-A', 'RESULT A'),
        ('req-B', 'chat-B', 'thread-B', 'RESULT B'),
    ]
    for req, chat, thread, result in cases:
        event = SimpleNamespace(
            source=SimpleNamespace(chat_id=f'webhook:ask-michel:{req}'),
            raw_message={
                'event_type': 'ask_michel', 'request_id': req,
                'requested_by': 'foster',
                'origin': {'platform': 'telegram', 'chat_id': chat, 'thread_id': thread},
            },
        )
        assert module._pre_gateway_dispatch(event=event) is None

    # Finish in reverse order to prove correlation is keyed, not FIFO.
    for req, chat, thread, result in reversed(cases):
        tokens = set_session_vars(platform='webhook', chat_id=f'webhook:ask-michel:{req}')
        try:
            assert module._transform_llm_output(response_text=result) is None
        finally:
            clear_session_vars(tokens)

    verified = []
    for req, chat, thread, result in cases:
        envelope = json.loads((outbox / f'{req}.json').read_text(encoding='utf-8'))
        payload = envelope['payload']
        body = json.dumps(payload, ensure_ascii=False, separators=(',', ':')).encode('utf-8')
        expected = hmac.new(secret.read_text().encode(), body, hashlib.sha256).hexdigest()
        assert hmac.compare_digest(envelope['signature'], expected)
        assert payload['origin']['chat_id'] == chat
        assert payload['origin']['thread_id'] == thread
        assert payload['result'] == result
        verified.append(req)

    print(json.dumps({
        'status': 'PASS', 'concurrent_origins': len(verified),
        'completion_order': 'reversed', 'cross_routing': False,
        'hmac_verified': True, 'atomic_files': sorted(verified),
    }))
