import React from 'react';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { render, screen } from '@testing-library/react';
import AtividadeRuntimeFrame from '../AtividadeRuntimeFrame';
import { letramentoEventBus } from '../../../utils/letramentoEvents';

function getRenderedIframe() {
  return screen.getByTitle('Atividade de Letramento Digital');
}

function getChannelToken(iframe) {
  const iframeUrl = new URL(iframe.getAttribute('src'), 'http://localhost');
  return new URLSearchParams(iframeUrl.hash.slice(1)).get('channelToken');
}

describe('AtividadeRuntimeFrame', () => {
  afterEach(() => {
    vi.restoreAllMocks();
  });

  it('despacha eventos validos enviados pelo iframe com token correto', () => {
    const dispatchSpy = vi.spyOn(letramentoEventBus, 'dispatch');

    render(
      <AtividadeRuntimeFrame
        htmlFile="/atividades/letramento/teste/index.html"
        atividadeId="atividade-segura"
      />,
    );

    const iframe = getRenderedIframe();
    const token = getChannelToken(iframe);

    window.dispatchEvent(
      new MessageEvent('message', {
        data: { type: 'completed', token, score: 100 },
        origin: 'null',
        source: iframe.contentWindow,
      }),
    );

    expect(dispatchSpy).toHaveBeenCalledWith('completed', {
      atividadeId: 'atividade-segura',
      score: 100,
    });
  });

  it('ignora mensagens com token invalido', () => {
    const dispatchSpy = vi.spyOn(letramentoEventBus, 'dispatch');

    render(
      <AtividadeRuntimeFrame
        htmlFile="/atividades/letramento/teste/index.html"
        atividadeId="atividade-segura"
      />,
    );

    const iframe = getRenderedIframe();

    window.dispatchEvent(
      new MessageEvent('message', {
        data: { type: 'completed', token: 'token-invalido', score: 100 },
        origin: 'null',
        source: iframe.contentWindow,
      }),
    );

    expect(dispatchSpy).not.toHaveBeenCalled();
  });

  it('ignora mensagens vindas de outra source', () => {
    const dispatchSpy = vi.spyOn(letramentoEventBus, 'dispatch');

    render(
      <AtividadeRuntimeFrame
        htmlFile="/atividades/letramento/teste/index.html"
        atividadeId="atividade-segura"
      />,
    );

    const iframe = getRenderedIframe();
    const token = getChannelToken(iframe);

    window.dispatchEvent(
      new MessageEvent('message', {
        data: { type: 'completed', token, score: 100 },
        origin: 'null',
        source: window,
      }),
    );

    expect(dispatchSpy).not.toHaveBeenCalled();
  });
});