/**
 * Server-side data for the TV and demo pages. Server-only (Prisma): import from server components.
 */
import { getDb } from '@pintrush/db';
import { verifyTvToken } from './token';

export interface TvRoomInfo {
  roomId: string;
  roomName: string;
  venueName: string;
  joinCode: string;
  timeZone: string;
}

export type TvRoomResult =
  | { ok: true; room: TvRoomInfo }
  | { ok: false; reason: 'missing' | 'invalid' | 'revoked' | 'unavailable' };

/**
 * Resolve the room a TV link may show. Everything comes from the verified token and the database:
 * the URL's room id only has to agree with the token, it is never trusted on its own.
 */
export async function loadTvRoom(urlRoomId: string, token: string | null): Promise<TvRoomResult> {
  if (!token) return { ok: false, reason: 'missing' };
  const claims = await verifyTvToken(token);
  if (!claims || claims.roomId !== urlRoomId) return { ok: false, reason: 'invalid' };
  try {
    const room = await getDb().room.findFirst({
      where: { id: claims.roomId, venueId: claims.venueId, status: 'ACTIVE' },
      select: { id: true, name: true, tvTokenVersion: true, venue: { select: { name: true, joinCode: true, timezone: true } } },
    });
    // A bumped tvTokenVersion revokes every older link (same rule the game server applies).
    if (!room || room.tvTokenVersion !== claims.v) return { ok: false, reason: 'revoked' };
    return {
      ok: true,
      room: { roomId: room.id, roomName: room.name, venueName: room.venue.name, joinCode: room.venue.joinCode, timeZone: room.venue.timezone },
    };
  } catch (err) {
    console.error('[tv] room lookup failed', err);
    return { ok: false, reason: 'unavailable' };
  }
}

export interface DemoRoom {
  roomId: string;
  venueId: string;
  joinCode: string;
  tvTokenVersion: number;
}

/** The public demo room (venue slug `demo`, room slug `demo`; ARCHITECTURE §4), or null. */
export async function findDemoRoom(): Promise<DemoRoom | null> {
  try {
    const venue = await getDb().venue.findUnique({
      where: { slug: 'demo' },
      select: { id: true, joinCode: true, rooms: { where: { slug: 'demo', status: 'ACTIVE' }, select: { id: true, tvTokenVersion: true }, take: 1 } },
    });
    const room = venue?.rooms[0];
    if (!venue || !room) return null;
    return { roomId: room.id, venueId: venue.id, joinCode: venue.joinCode, tvTokenVersion: room.tvTokenVersion };
  } catch (err) {
    console.error('[demo] demo room lookup failed', err);
    return null;
  }
}
