import { ConfigService } from '@nestjs/config';
import * as jwt from 'jsonwebtoken';
import { ZoomJwtService } from './zoom-jwt.service';
import { ZoomSdkRole } from '../enums/zoom-role.enum';
import { ZOOM_ENV_KEYS } from 'src/common/constants/zoom.constants';

describe('ZoomJwtService', () => {
  const SDK_KEY = 'test-sdk-key';
  const SDK_SECRET = 'test-sdk-secret';

  const config = {
    get: (key: string) => {
      if (key === ZOOM_ENV_KEYS.SDK_KEY) return SDK_KEY;
      if (key === ZOOM_ENV_KEYS.SDK_SECRET) return SDK_SECRET;
      return undefined;
    },
  } as unknown as ConfigService;

  const logger = { error: jest.fn(), log: jest.fn() } as any;

  const service = new ZoomJwtService(config, logger);

  it('generates a verifiable HS256 token with the meeting number and role', () => {
    const token = service.generateJoinToken('99887766554', ZoomSdkRole.HOST);
    const decoded = jwt.verify(token, SDK_SECRET) as Record<string, any>;

    expect(decoded.sdkKey).toBe(SDK_KEY);
    expect(decoded.appKey).toBe(SDK_KEY);
    expect(decoded.mn).toBe('99887766554');
    expect(decoded.role).toBe(ZoomSdkRole.HOST);
    expect(decoded.exp).toBeGreaterThan(decoded.iat);
  });

  it('defaults to the attendee role', () => {
    const token = service.generateJoinToken('123');
    const decoded = jwt.verify(token, SDK_SECRET) as Record<string, any>;
    expect(decoded.role).toBe(ZoomSdkRole.ATTENDEE);
  });

  it('produces a token rejected by a wrong secret', () => {
    const token = service.generateJoinToken('123');
    expect(() => jwt.verify(token, 'wrong-secret')).toThrow();
  });
});
