FROM node:20-bullseye

WORKDIR /usr/src/app

ARG ODIN_NODEJS_VERSION=latest

RUN npm init -y \
    && npm install --omit=dev "@4players/odin-nodejs@${ODIN_NODEJS_VERSION}"

RUN cat <<'EOF' > connection-test.js
const odin = require('@4players/odin-nodejs');
const { OdinClient } = odin;

const accessKey = process.env.ODIN_ACCESS_KEY;
const roomId = process.env.ODIN_ROOM_ID || 'odin-sdk-ci-test';
const userId = process.env.ODIN_USER_ID || `docker-example-${Math.floor(Math.random() * 1e6)}`;
const gateway = process.env.ODIN_GATEWAY || 'https://gateway.odin.4players.io';
const runDurationMs = Number(process.env.RUN_DURATION_MS || 15000);

if (!accessKey) {
    console.error('❌ Missing ODIN_ACCESS_KEY environment variable');
    process.exit(1);
}

const client = new OdinClient();
const token = client.generateToken(accessKey, roomId, userId);
const room = client.createRoom(token);

room.onConnectionStateChanged((event) => {
    const message = event.message ? ` - ${event.message}` : '';
    console.log(`[state] ${event.state}${message}`);
});

room.onJoined((event) => {
    console.log(`[joined] room=${event.roomId} peer=${event.ownPeerId}`);
});

room.onLeft((event) => {
    console.log(`[left] reason=${event.reason}`);
});

room.onPeerJoined((event) => {
    console.log(`[peer-joined] peer=${event.peerId}`);
});

room.onPeerLeft((event) => {
    console.log(`[peer-left] peer=${event.peerId}`);
});

console.log(`Connecting to ${gateway} as ${userId} (room: ${roomId}) ...`);
room.join(gateway);

setTimeout(() => {
    console.log('✅ Connection test complete, closing room');
    room.close();
}, runDurationMs);

process.on('SIGINT', () => {
    console.log('Received SIGINT, closing room');
    room.close();
    process.exit(0);
});
EOF

ENV ODIN_GATEWAY=https://gateway.odin.4players.io
ENV ODIN_ROOM_ID=odin-sdk-ci-test
ENV RUN_DURATION_MS=15000

CMD ["node", "connection-test.js"]
