"""Actual loopback gateway authentication rehearsal on the selected host."""
import asyncio,json
from infinbot_common import private_read,Rejected
from consigliere_server import ConsigliereWebSocketServer


async def rehearse(config):
    from websockets.asyncio.server import serve
    from websockets.asyncio.client import connect
    from websockets.exceptions import ConnectionClosed
    app=ConsigliereWebSocketServer(token_file=config['gateway_token_file'],risk_state=config['risk_state'],db_filepath=config['db_path'])
    async with serve(app.register_client_handshake,'127.0.0.1',0,max_size=4096,max_queue=4,
                     origins=[None],compression=None,close_timeout=1) as server:
        port=server.sockets[0].getsockname()[1];url='ws://127.0.0.1:'+str(port)
        async with connect(url,proxy=None,close_timeout=1) as ws:
            await ws.send(json.dumps({'action':'authenticate','token':'INVALID_TEST_TOKEN'}))
            try:await asyncio.wait_for(ws.recv(),2);raise Rejected('Invalid token accepted')
            except ConnectionClosed:pass
        async with connect(url,proxy=None,close_timeout=1) as ws:
            await ws.send(json.dumps({'action':'authenticate','token':private_read(config['gateway_token_file'],1024).decode().strip()}))
            if json.loads(await ws.recv())['status']!='OWNER_AUTHENTICATED':raise Rejected('Valid owner blocked')
            await ws.send(json.dumps({'action':'health'}))
            if json.loads(await ws.recv())['status']!='READ_COMPLETED':raise Rejected('Read did not execute')
            await ws.send(json.dumps({'action':'BUY'}))
            if json.loads(await ws.recv())['status']!='COMMAND_REJECTED_UNSUPPORTED':raise Rejected('Order command accepted')
    return {'status':'HOST_GATEWAY_AUTHENTICATION_REHEARSED','invalid_token_rejected':True,
            'valid_owner_read_completed':True,'order_commands_rejected':True,'remote_tls_verified':False}
