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

const PADRAO: TabelaDePontos = {
  pointsExact: 10,
  pointsWinnerDiff: 5,
  pointsWinner: 3,
};

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

describe('ScoringService — regra 10 / 5 / 3 / 0', () => {
  it('placar exato vale 10', () => {
    expect(pontos(2, 1, 2, 1)).toBe(10);
    expect(pontos(0, 0, 0, 0)).toBe(10);
  });

  it('acertar vencedor e saldo vale 5', () => {
    // 3x2 e 2x1: mesmo vencedor, mesmo saldo (+1), placar diferente.
    expect(pontos(3, 2, 2, 1)).toBe(5);
    expect(pontos(1, 3, 2, 4)).toBe(5);
  });

  it('acertar só o vencedor vale 3', () => {
    // 3x0 e 2x1: mesmo vencedor, saldos diferentes (+3 vs +1).
    expect(pontos(3, 0, 2, 1)).toBe(3);
    expect(pontos(0, 2, 1, 4)).toBe(3);
  });

  it('errar o vencedor vale 0', () => {
    expect(pontos(2, 1, 1, 2)).toBe(0);
    expect(pontos(1, 0, 0, 0)).toBe(0);
    expect(pontos(0, 0, 1, 0)).toBe(0);
  });

  it('empate acertado sem placar exato vale 3, não 5', () => {
    // Os dois têm saldo 0, mas o PRD decide que só o placar exato vale 10 e
    // qualquer outro empate cai em "só vencedor".
    expect(pontos(1, 1, 2, 2)).toBe(3);
    expect(pontos(0, 0, 3, 3)).toBe(3);
    // E o empate exato continua valendo 10.
    expect(pontos(2, 2, 2, 2)).toBe(10);
  });

  it('usa a tabela do bolão, não valores fixos', () => {
    const simples: TabelaDePontos = {
      pointsExact: 3,
      pointsWinnerDiff: 1,
      pointsWinner: 1,
    };
    expect(pontos(2, 1, 2, 1, simples)).toBe(3);
    expect(pontos(3, 2, 2, 1, simples)).toBe(1);
    expect(pontos(2, 1, 1, 2, simples)).toBe(0);
  });

  it('classifica a faixa, para o extrato poder mostrar o motivo', () => {
    expect(ScoringService.faixa(2, 1, 2, 1)).toBe('PLACAR_EXATO');
    expect(ScoringService.faixa(3, 2, 2, 1)).toBe('VENCEDOR_E_SALDO');
    expect(ScoringService.faixa(3, 0, 2, 1)).toBe('SO_VENCEDOR');
    expect(ScoringService.faixa(0, 1, 1, 0)).toBe('ERROU');
  });
});
