import { ScoringService, TabelaDePontos } from './scoring.service';

/**
 * Execução do plano `docs/testes/PR-1-plano.md`, caso por caso.
 *
 * Os nomes carregam o **ID do caso** de propósito: quem reprova uma task
 * escreve "reaberta — falhou PR-1-06", e esse ID tem que ser greppável no
 * código. Sem isso o plano e a suíte viram dois documentos que divergem.
 *
 * Os casos PR-1-11 a PR-1-14 dependem de banco e de app rodando; ficam nos
 * e2e e na verificação em device, e estão anotados no plano.
 */
const PADRAO: TabelaDePontos = {
  pointsExact: 10,
  pointsWinnerDiff: 5,
  pointsWinner: 3,
};

const faixa = ScoringService.faixa;
const pontos = (
  pc: number,
  pf: number,
  oc: number,
  of: number,
  tabela = PADRAO,
) => ScoringService.pontos(faixa(pc, pf, oc, of), tabela);

describe('Plano PR-1 — cálculo do ponto', () => {
  it('PR-1-01 placar exato', () => {
    expect(faixa(2, 1, 2, 1)).toBe('PLACAR_EXATO');
    expect(pontos(2, 1, 2, 1)).toBe(10);
  });

  it('PR-1-02 vencedor e saldo, sem exato', () => {
    expect(faixa(3, 1, 2, 0)).toBe('VENCEDOR_E_SALDO');
    expect(pontos(3, 1, 2, 0)).toBe(5);
  });

  it('PR-1-03 só o vencedor', () => {
    expect(faixa(1, 0, 3, 0)).toBe('SO_VENCEDOR');
    expect(pontos(1, 0, 3, 0)).toBe(3);
  });

  it('PR-1-04 errou o vencedor', () => {
    expect(faixa(0, 2, 2, 0)).toBe('ERROU');
    expect(pontos(0, 2, 2, 0)).toBe(0);
  });

  it('PR-1-05 empate exato', () => {
    expect(faixa(1, 1, 1, 1)).toBe('PLACAR_EXATO');
    expect(pontos(1, 1, 1, 1)).toBe(10);
  });

  it('PR-1-06 empate com placar diferente vale só vencedor', () => {
    // Todo empate tem saldo 0: "acertar o saldo" não diz nada além de acertar
    // o empate. Se o produto mudar isso, este caso falha primeiro.
    expect(faixa(1, 1, 4, 4)).toBe('SO_VENCEDOR');
    expect(pontos(1, 1, 4, 4)).toBe(3);
  });

  it('PR-1-07 palpitou empate, deu vitória', () => {
    expect(pontos(1, 1, 2, 1)).toBe(0);
  });

  it('PR-1-08 palpitou vitória, deu empate', () => {
    // Simétrico de PR-1-07: sinal invertido passaria em só um dos dois.
    expect(pontos(2, 1, 1, 1)).toBe(0);
  });

  it('PR-1-09 saldo igual em vitória do visitante', () => {
    expect(faixa(0, 2, 1, 3)).toBe('VENCEDOR_E_SALDO');
    expect(pontos(0, 2, 1, 3)).toBe(5);
  });

  it('PR-1-10 tabela customizada é lida do bolão', () => {
    const custom: TabelaDePontos = {
      pointsExact: 20,
      pointsWinnerDiff: 10,
      pointsWinner: 5,
    };
    expect(pontos(2, 1, 2, 1, custom)).toBe(20);
    expect(pontos(3, 1, 2, 0, custom)).toBe(10);
    expect(pontos(1, 0, 3, 0, custom)).toBe(5);
    expect(pontos(0, 2, 2, 0, custom)).toBe(0);
  });
});
