/**
 * ╔══════════════════════════════════════════════════════════════════════╗
 * ║   OVERMIND BRIDGE — ArgParser (Zero-Dep CLI Parser)                  ║
 * ║                                                                      ║
 * ║   Parser d'arguments minimaliste, cohérent avec le style du projet.  ║
 * ║   Supporte :                                                          ║
 * ║     - Flags courts (-v) et longs (--verbose)                         ║
 * ║     - Valeurs via = ou espace (--port 3100, --port=3100)             ║
 * ║     - Valeurs répétées (--include a --include b)                     ║
 * ║     - Booléens negations (--no-auth)                                 ║
 * ║     - Stdin auto-détection                                            ║
 * ╚══════════════════════════════════════════════════════════════════════╝
 */
// ─── Public API ────────────────────────────────────────────────────────────
/**
 * Parse process.argv.slice(2). Le premier non-flag devient `command`.
 */
export function parseArgs(argv = process.argv.slice(2)) {
    const flags = {};
    const positionals = [];
    let command;
    let commandConsumed = false;
    for (let i = 0; i < argv.length; i++) {
        const arg = argv[i];
        // --flag=value
        if (arg.startsWith('--') && arg.includes('=')) {
            const eqIdx = arg.indexOf('=');
            const key = arg.slice(2, eqIdx);
            const value = arg.slice(eqIdx + 1);
            flags[key] = coerceValue(value, true);
            if (!commandConsumed) {
                command = key; // au cas où le subcommand est en --foo=bar (rare)
                commandConsumed = true;
            }
            continue;
        }
        // --flag value | --flag
        if (arg.startsWith('--')) {
            const key = arg.slice(2);
            const next = argv[i + 1];
            // Booléen si prochain arg est un autre flag ou rien
            if (next === undefined || next.startsWith('--')) {
                flags[key] = true;
            }
            else {
                flags[key] = coerceValue(next, false);
                i++; // consomme la valeur
            }
            continue;
        }
        // -f value | -f | -abc (flags courts combinés)
        if (arg.startsWith('-') && arg.length > 1) {
            // Combinés : -abc → a, b, c tous booléens
            if (/^-[a-z]+$/i.test(arg)) {
                for (const ch of arg.slice(1)) {
                    flags[ch] = true;
                }
                continue;
            }
            // -v value
            const key = arg.slice(1);
            const next = argv[i + 1];
            if (next === undefined || next.startsWith('--')) {
                flags[key] = true;
            }
            else {
                flags[key] = coerceValue(next, false);
                i++;
            }
            continue;
        }
        // Positionnel
        if (!commandConsumed) {
            command = arg;
            commandConsumed = true;
        }
        else {
            positionals.push(arg);
        }
    }
    return { command, flags, positionals, raw: argv };
}
/**
 * Récupère un flag avec valeur par défaut et coercion de type.
 */
export function getFlag(args, name, defaultValue) {
    const value = args.flags[name];
    if (value === undefined)
        return defaultValue;
    return value;
}
/**
 * Récupère un flag, throw si manquant.
 */
export function requireFlag(args, name) {
    const value = args.flags[name];
    if (value === undefined) {
        throw new Error(`Missing required flag: --${name}`);
    }
    return value;
}
// ─── Helpers ───────────────────────────────────────────────────────────────
function coerceValue(raw, fromEquals) {
    // Si --flag=true / false
    if (raw === 'true')
        return true;
    if (raw === 'false')
        return false;
    // Si nombre
    if (/^-?\d+(\.\d+)?$/.test(raw))
        return Number(raw);
    // Sinon string brut
    return raw;
}
// ─── Stdin detection ───────────────────────────────────────────────────────
/**
 * Vérifie si stdin a des données piped (TTY = false).
 */
export function hasStdinData() {
    return !process.stdin.isTTY;
}
/**
 * Lit stdin en entier (utf-8).
 */
export async function readStdin() {
    return new Promise((resolve, reject) => {
        let data = '';
        process.stdin.setEncoding('utf-8');
        process.stdin.on('data', (chunk) => (data += chunk));
        process.stdin.on('end', () => resolve(data));
        process.stdin.on('error', reject);
    });
}
//# sourceMappingURL=ArgParser.js.map