import fs from 'fs';
import path from 'path';
import {SRC_ROOT, collectSourceFiles} from '../../testUtils/sourceFiles';

/**
 * Objectif produit : aucun lien du site n'est souligné. On le vérifie sur les sources,
 * comme `layout.test.tsx` le fait pour le gabarit : jsdom n'applique pas les feuilles
 * de style importées, seule la lecture du CSS permet de verrouiller la règle.
 */

/** `text-decoration: underline` / `text-decoration-line: underline` en CSS et styled-jsx. */
const CSS_UNDERLINE = /text-decoration(?:-line)?\s*:[^;}]*underline/;
/** `style={{textDecoration: 'underline'}}` en JSX. */
const JSX_UNDERLINE = /textDecoration\s*:\s*['"][^'"]*underline/;
/** Classe utilitaire Bootstrap devenue redondante avec la règle globale. */
const BOOTSTRAP_NO_UNDERLINE_CLASS = /\btext-decoration-none\b/;

/** Les tests ne livrent aucun style et citent la règle interdite dans leurs commentaires. */
const IGNORED_DIRECTORIES = ['node_modules', '__tests__'];

/** `fichier:ligne` de chaque ligne de `src/` qui correspond à l'un des motifs. */
function linesMatching(...patterns: RegExp[]): string[] {
  return collectSourceFiles(SRC_ROOT, IGNORED_DIRECTORIES)
    .flatMap(file =>
      fs
        .readFileSync(file, 'utf8')
        .split('\n')
        .flatMap((line, index) =>
          patterns.some(pattern => pattern.test(line))
            ? [`${path.relative(SRC_ROOT, file)}:${index + 1}`]
            : []
        )
    )
    .sort();
}

describe('Link underline', () => {
  it('shouldDisableUnderlineOnEveryLinkState', () => {
    const tammkreiz = fs.readFileSync(path.join(SRC_ROOT, 'styles', 'tammkreiz.css'), 'utf8');

    // Bootstrap souligne les liens : la règle TammKreiz doit couvrir les quatre états,
    // sinon `a:hover` / `a:focus` de Bootstrap l'emportent par spécificité.
    expect(tammkreiz).toMatch(
      /^a,\s*a:hover,\s*a:focus,\s*a:active\s*\{[^}]*text-decoration:\s*none;/m
    );
  });

  it('shouldNotNeedTheBootstrapUtilityClassAnymore', () => {
    const offenders = linesMatching(BOOTSTRAP_NO_UNDERLINE_CLASS);

    expect(offenders).toEqual([]);
  });

  it('shouldNotUnderlineAnythingUnderSrc', () => {
    const offenders = linesMatching(CSS_UNDERLINE, JSX_UNDERLINE);

    expect(offenders).toEqual([]);
  });
});
