import { test } from "node:test";
import assert from "node:assert/strict";

import { aulaParaContinuar, contarProgresso, vizinhas, type MarcaDaAula } from "./progresso-do-curso.ts";

const ordem = [
  { id: "a1", aberta: true },
  { id: "a2", aberta: true },
  { id: "a3", aberta: true },
  { id: "a4", aberta: false },
];

function marcas(lista: Array<[string, boolean, string]>): Map<string, MarcaDaAula> {
  return new Map(lista.map(([id, concluida, atualizadoEm]) => [id, { concluida, atualizadoEm }]));
}

test("sem nada assistido, começa pela primeira aula aberta", () => {
  assert.deepEqual(aulaParaContinuar(ordem, new Map()), { id: "a1", modo: "comecar" });
  assert.deepEqual(aulaParaContinuar([{ id: "x", aberta: false }, { id: "y", aberta: true }], new Map()), { id: "y", modo: "comecar" });
});

test("volta na última aula mexida que ainda não terminou", () => {
  const m = marcas([
    ["a1", true, "2026-10-01T10:00:00Z"],
    ["a3", false, "2026-10-02T10:00:00Z"],
  ]);
  assert.deepEqual(aulaParaContinuar(ordem, m), { id: "a3", modo: "continuar" });
});

test("terminou a última mexida: vai para a próxima que falta", () => {
  const m = marcas([
    ["a1", true, "2026-10-01T10:00:00Z"],
    ["a2", true, "2026-10-02T10:00:00Z"],
  ]);
  assert.deepEqual(aulaParaContinuar(ordem, m), { id: "a3", modo: "continuar" });
});

test("voltou numa aula do começo: segue para a que falta, mesmo antes", () => {
  const m = marcas([
    ["a2", false, "2026-10-01T10:00:00Z"],
    ["a3", true, "2026-10-03T10:00:00Z"],
  ]);
  assert.deepEqual(aulaParaContinuar(ordem, m), { id: "a1", modo: "continuar" });
});

test("tudo o que abriu já foi: em dia (null) ou rever", () => {
  const m = marcas([
    ["a1", true, "2026-10-01T10:00:00Z"],
    ["a2", true, "2026-10-02T10:00:00Z"],
    ["a3", true, "2026-10-03T10:00:00Z"],
  ]);
  assert.equal(aulaParaContinuar(ordem, m), null);
  assert.deepEqual(aulaParaContinuar(ordem.slice(0, 3), m), { id: "a1", modo: "rever" });
  assert.equal(aulaParaContinuar([{ id: "z", aberta: false }], new Map()), null);
});

test("a conta do progresso só usa as aulas que existem", () => {
  const m = marcas([
    ["a1", true, "2026-10-01T10:00:00Z"],
    ["apagada", true, "2026-10-01T10:00:00Z"],
    ["a2", false, "2026-10-01T10:00:00Z"],
  ]);
  assert.deepEqual(contarProgresso(ordem, m), { total: 4, concluidas: 1, percentual: 25 });
  assert.deepEqual(contarProgresso([], m), { total: 0, concluidas: 0, percentual: 0 });
});

test("vizinhas: anterior e próxima na ordem do curso", () => {
  assert.deepEqual(vizinhas(ordem, "a1"), { anterior: null, proxima: { id: "a2", aberta: true } });
  assert.deepEqual(vizinhas(ordem, "a3"), { anterior: { id: "a2", aberta: true }, proxima: { id: "a4", aberta: false } });
  assert.deepEqual(vizinhas(ordem, "nada"), { anterior: null, proxima: null });
});
