using System.Diagnostics;
using Microsoft.JSInterop;

namespace MaBibli.Client.Scan;

/// <summary>
/// Mesure du coût réel du décodage <b>dans le navigateur</b>.
///
/// CLAUDE.md ne dispose que de chiffres JIT x64 (0,53 ms/frame dans le pire cas) et d'une
/// extrapolation non vérifiée pour le WASM interprété (~5-10 ms/frame). Ce banc d'essai
/// donne le chiffre constaté, sur la machine de l'utilisateur, sans caméra ni code-barres.
///
/// On mesure volontairement le <b>pire cas</b> — une frame de bruit sans code-barres —
/// car c'est l'échec de décodage qui coûte le plus cher, et la quasi-totalité des frames
/// d'une caméra sont dans ce cas. C'est donc lui qui gouverne le framerate atteignable.
///
/// Depuis la console du navigateur :
/// <code>await DotNet.invokeMethodAsync('MaBibli.Client', 'MesurerScan', 640, 288, 20)</code>
/// </summary>
public static class BancEssaiScan
{
    [JSInvokable("MesurerScan")]
    public static double MesurerPireCasMs(int largeur, int hauteur, int iterations)
    {
        var rgba = new byte[largeur * hauteur * 4];
        new Random(1234).NextBytes(rgba);

        // Un tour à blanc : la première exécution paie l'initialisation de ZXing,
        // qui n'a rien à voir avec le coût par frame en régime établi.
        IsbnScanner.TryDecode(rgba, largeur, hauteur);

        var depart = Stopwatch.GetTimestamp();
        for (var i = 0; i < iterations; i++)
        {
            IsbnScanner.TryDecode(rgba, largeur, hauteur);
        }

        return Stopwatch.GetElapsedTime(depart).TotalMilliseconds / iterations;
    }
}
