import type { Server as HttpServer } from "http";

import { Server } from "socket.io";

import { env } from "../config/env.js";
import { verifyAccessToken } from "../lib/jwt.js";

export const createRealtimeServer = (server: HttpServer) => {
  const io = new Server(server, {
    cors: {
      origin: true,
      credentials: true,
    },
    path: "/ws/socket.io",
  });

  io.use((socket, next) => {
    const token =
      (typeof socket.handshake.auth.token === "string" && socket.handshake.auth.token) ||
      (typeof socket.handshake.headers.authorization === "string" &&
        socket.handshake.headers.authorization.replace(/^Bearer\s+/i, ""));

    if (!token) {
      return next(new Error("Missing socket token"));
    }

    try {
      const user = verifyAccessToken(token);
      socket.data.user = user;
      return next();
    } catch {
      return next(new Error("Invalid socket token"));
    }
  });

  io.on("connection", (socket) => {
    const user = socket.data.user as { id: string };
    socket.join(`user:${user.id}`);
    socket.emit("socket:ready", { connectedAt: new Date().toISOString() });
  });

  return io;
};
