/**
 * build-label.spec.js
 *
 * Verifies that the {{BUILD_LABEL}} placeholder is correctly substituted in all
 * four tool dist and website files:
 *
 *   - No placeholder text leaks through
 *   - The .build-timestamp element is present and visible in the browser
 *   - The label content is either a timestamp ("Built: 20...") or a version ("v...")
 *   - website/ files (when present) always show the version format
 *
 * Note: dist/ files may show either format depending on whether the last build
 * was a dev build (timestamp) or a release build (version). Both are valid.
 */
import { test, expect } from '@playwright/test';
import * as path from 'path';
import * as fs from 'fs';

const tools = ['archive', 'transmittal', 'classifier', 'mdedit'];

for (const tool of tools) {
    const distPath    = path.resolve(`${tool}/dist/${tool}.html`);
    const websitePath = path.resolve(`website/${tool}.html`);

    test.describe(`${tool}: build-label`, () => {

        test(`dist file: no placeholder text leaks through`, async () => {
            const html = fs.readFileSync(distPath, 'utf8');
            expect(html).not.toContain('{{BUILD_LABEL}}');
            expect(html).not.toContain('{{BUILD_TIMESTAMP}}');
        });

        test(`dist file: .build-timestamp element is visible in browser`, async ({ page }) => {
            const waitUntil = tool === 'mdedit' ? 'load' : 'domcontentloaded';
            await page.goto(`file://${distPath}`, { waitUntil });
            const el = page.locator('.build-timestamp');
            await expect(el).toBeVisible({ timeout: 10000 });
        });

        test(`dist file: label is a valid channel or version string`, async () => {
            const html = fs.readFileSync(distPath, 'utf8');
            // Channel labels (alpha/beta) are wrapped in an inner <span style="color:red...">;
            // stable version labels are bare text.
            const match = html.match(/class="build-timestamp">(?:<span[^>]*>)?([^<]+?)(?:<\/span>)?</);
            expect(match, 'build-timestamp element must have text content').toBeTruthy();
            const label = match[1];
            // Plain dev builds and --release alpha|beta carry the next-stable
            // target as a pre-release suffix:
            //   "v0.0.3-alpha · 2026-04-29 00:50:17 · 714faf6-dirty"  (plain dev)
            //   "v0.0.3-alpha · 2026-04-29 · 714faf6"                  (--release alpha)
            //   "v0.0.3-beta · 2026-04-29 · 714faf6"                   (--release beta)
            const isChannel = /^v\d+\.\d+\.\d+-(alpha|beta) · 20\d\d-\d\d-\d\d( \d\d:\d\d:\d\d)? · [0-9a-f]+(-dirty)?$/.test(label);
            const isVersion = /^v\d+\.\d+\.\d+$/.test(label);
            expect(isChannel || isVersion,
                `Expected channel or version label, got: "${label}"`
            ).toBe(true);
        });

        test(`website file: label shows version format (release build)`, async () => {
            if (!fs.existsSync(websitePath)) {
                test.skip(true, `website/${tool}.html not present — run sh ${tool}/build.sh --release first`);
                return;
            }
            const html = fs.readFileSync(websitePath, 'utf8');
            expect(html).not.toContain('{{BUILD_LABEL}}');
            expect(html).not.toContain('{{BUILD_TIMESTAMP}}');
            expect(html).toMatch(/class="build-timestamp">(?:<span[^>]*>)?v\d+\.\d+\.\d+( BETA)?(?:<\/span>)?</);
        });
    });
}
