import type { SfuSessionDescriptor, SfuSessionState } from './types';

type StoredSfuSession = SfuSessionDescriptor & {
  updatedAt: string;
};

export class SfuSessionRegistry {
  private readonly sessions = new Map<string, StoredSfuSession>();

  get(streamSessionId: string): SfuSessionDescriptor | null {
    const found = this.sessions.get(streamSessionId);
    if (!found) return null;
    const { updatedAt: _updatedAt, ...descriptor } = found;
    return descriptor;
  }

  set(session: SfuSessionDescriptor): SfuSessionDescriptor {
    const now = new Date().toISOString();
    this.sessions.set(session.streamSessionId, { ...session, updatedAt: now });
    return session;
  }

  updateState(streamSessionId: string, state: SfuSessionState): SfuSessionDescriptor | null {
    const existing = this.sessions.get(streamSessionId);
    if (!existing) return null;

    const next: StoredSfuSession = {
      ...existing,
      state,
      updatedAt: new Date().toISOString(),
    };
    this.sessions.set(streamSessionId, next);
    const { updatedAt: _updatedAt, ...descriptor } = next;
    return descriptor;
  }

  list(): SfuSessionDescriptor[] {
    return Array.from(this.sessions.values()).map(({ updatedAt: _updatedAt, ...descriptor }) => descriptor);
  }
}

