import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";

const themeFile = (path) =>
    readFile(new URL(`../../${path}`, import.meta.url), "utf8");

const controllers = JSON.parse(await themeFile("assets/controllers.json"));

assert.deepEqual(
    controllers.controllers["@cpcreation/altcha-bundle"]?.altcha,
    {
        enabled: true,
        fetch: "eager",
        autoimport: {
            "@cpcreation/altcha-bundle/css/altcha.css": true,
        },
    },
    "Le thème doit charger le contrôleur et les styles du bundle ALTCHA.",
);
assert.equal(
    controllers.controllers["@cpcreation/viti-core"]?.["captcha-spam-filter"],
    undefined,
    "Le thème ne doit plus référencer l’ancien contrôleur captcha-spam-filter de VitiCore.",
);

const forms = [
    {
        name: "la confirmation d’inscription",
        template: await themeFile("templates/components/security/RegisterConfirmForm.html.twig"),
        finalAction: "submitRegisterConfirm",
    },
    {
        name: "la réinitialisation du mot de passe",
        template: await themeFile("templates/components/security/ResetPasswordForm.html.twig"),
        finalAction: "submitResetPassword",
    },
];

for (const { name, template, finalAction } of forms) {
    assert.match(
        template,
        /['"]data-model['"]\s*:\s*['"]norender\|\*['"]/u,
        `Le formulaire de ${name} doit synchroniser ses champs sans morph automatique.`,
    );
    assert.doesNotMatch(
        template,
        /['"]data-model['"]\s*:\s*['"]on\(input\)\|\*['"]/u,
        `Le formulaire de ${name} ne doit pas relancer un rendu à chaque saisie.`,
    );
    assert.match(
        template,
        /['"]data-action['"]\s*:\s*['"]live#action:prevent['"]/u,
        `Le formulaire de ${name} doit conserver son action Live de soumission.`,
    );
    assert.match(
        template,
        new RegExp(`['"]data-live-action-param['"]\\s*:\\s*['"]${finalAction}['"]`, "u"),
        `Le formulaire de ${name} doit conserver son action finale ${finalAction}.`,
    );
    assert.match(
        template,
        /['"]data-live-action-param['"]\s*:\s*['"]validatePasswords['"]/u,
        `Le formulaire de ${name} doit conserver la validation partielle des mots de passe.`,
    );
}

console.log(
    "OK — les formulaires de sécurité Heritage synchronisent sans morph et conservent leurs actions Live.",
);
