import asyncio
import hashlib
import hmac
import importlib.util
import json
import sys
from pathlib import Path

from aiohttp import web

REPO = Path('C:/Solutions/foster/hermes-agent')
sys.path.insert(0, str(REPO))
spec = importlib.util.spec_from_file_location(
    'staged_webhook',
    'C:/MCSJAgent/foster-ask-michel/staged/webhook.py',
)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
WebhookAdapter = module.WebhookAdapter
from gateway.config import PlatformConfig


async def main():
    received = []

    async def callback(request):
        body = await request.read()
        received.append((body, dict(request.headers)))
        return web.json_response({'status': 'delivered'})

    app = web.Application()
    app.router.add_post('/webhooks/michel-result', callback)
    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner, '127.0.0.1', 0)
    await site.start()
    port = site._server.sockets[0].getsockname()[1]

    secret = 'callback-test-secret'
    adapter = WebhookAdapter(PlatformConfig(enabled=True, extra={'routes': {}}))
    chat_id = 'webhook:ask-michel:req-123'
    adapter._delivery_info[chat_id] = {
        'deliver': 'http_callback',
        'deliver_extra': {
            'url': f'http://127.0.0.1:{port}/webhooks/michel-result',
            'secret': secret,
        },
        'payload': {
            'request_id': 'req-123',
            'requested_by': 'foster',
            'origin': {
                'platform': 'telegram',
                'chat_id': 'chat-20',
                'thread_id': 'thread-7',
                'user_id': 'user-9',
            },
        },
    }

    preview = await adapter.send(chat_id, 'working...', metadata={'expect_edits': True})
    assert preview.success and received == []

    final = await adapter.send(chat_id, 'VERIFIED RESULT', metadata={'notify': True})
    assert final.success and len(received) == 1
    body, headers = received[0]
    expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    assert hmac.compare_digest(headers['X-Webhook-Signature'], expected)
    payload = json.loads(body)
    assert payload['request_id'] == 'req-123'
    assert payload['origin']['chat_id'] == 'chat-20'
    assert payload['origin']['thread_id'] == 'thread-7'
    assert payload['result'] == 'VERIFIED RESULT'

    adapter._delivery_info['bad'] = {
        'deliver': 'http_callback',
        'deliver_extra': {'url': 'http://example.com/callback', 'secret': secret},
        'payload': {'request_id': 'bad-1'},
    }
    rejected = await adapter.send('bad', 'nope', metadata={'notify': True})
    assert not rejected.success
    assert 'loopback' in rejected.error

    await runner.cleanup()
    print(json.dumps({
        'status': 'PASS',
        'preview_callbacks': 0,
        'final_callbacks': len(received),
        'hmac_verified': True,
        'origin_preserved': True,
        'non_loopback_rejected': True,
    }))


if __name__ == '__main__':
    asyncio.run(main())
