import { describe, expect, it } from 'vitest';
import { lastMoveCells, replay } from './board';
import type { MoveRecord } from './model';

function play(tiles: { row: number; col: number; letter: string; blank: boolean }[]): MoveRecord {
  return {
    player: 0,
    action: 'play',
    dir: 'H',
    mainRow: tiles[0].row,
    mainCol: tiles[0].col,
    tiles,
    words: [],
    count: 0,
    score: 0,
    total: 0,
  };
}

function simple(action: 'pass' | 'exchange'): MoveRecord {
  return { player: 1, action, dir: '', mainRow: 0, mainCol: 0, tiles: [], words: [], count: 0, score: 0, total: 0 };
}

const pass = simple('pass');

describe('board replay', () => {
  it('places play tiles and ignores non-play moves', () => {
    const moves = [
      play([
        { row: 7, col: 7, letter: 'A', blank: false },
        { row: 7, col: 8, letter: 'B', blank: true },
      ]),
      pass,
      play([{ row: 8, col: 7, letter: 'C', blank: false }]),
    ];
    const b = replay(moves);
    expect(b[7][7]?.letter).toBe('A');
    expect(b[7][8]?.blank).toBe(true);
    expect(b[8][7]?.letter).toBe('C');
    expect(b[0][0]).toBeNull();
    expect(b.length).toBe(15);
    expect(b[0].length).toBe(15);
  });
});

describe('lastMoveCells', () => {
  it('returns the last move cells when the last move is a play', () => {
    const moves = [
      pass,
      play([
        { row: 7, col: 7, letter: 'A', blank: false },
        { row: 7, col: 8, letter: 'B', blank: false },
      ]),
    ];
    expect(lastMoveCells(moves)).toEqual(new Set(['7,7', '7,8']));
  });

  it('highlights nothing when the last move is a pass after a play', () => {
    const moves = [play([{ row: 7, col: 7, letter: 'A', blank: false }]), pass];
    expect(lastMoveCells(moves).size).toBe(0);
  });

  it('highlights nothing when the last move is an exchange', () => {
    const moves = [play([{ row: 7, col: 7, letter: 'A', blank: false }]), simple('exchange')];
    expect(lastMoveCells(moves).size).toBe(0);
  });

  it('highlights nothing for an empty journal', () => {
    expect(lastMoveCells([]).size).toBe(0);
  });
});
