import { resolveCommitHash } from "../infra/git-commit.js";
import { visibleWidth } from "../terminal/ansi.js";
import { isRich, theme } from "../terminal/theme.js";
import { pickTagline } from "./tagline.js";
let bannerEmitted = false;
const graphemeSegmenter = typeof Intl !== "undefined" && "Segmenter" in Intl
    ? new Intl.Segmenter(undefined, { granularity: "grapheme" })
    : null;
function splitGraphemes(value) {
    if (!graphemeSegmenter)
        return Array.from(value);
    try {
        return Array.from(graphemeSegmenter.segment(value), (seg) => seg.segment);
    }
    catch {
        return Array.from(value);
    }
}
const hasJsonFlag = (argv) => argv.some((arg) => arg === "--json" || arg.startsWith("--json="));
const hasVersionFlag = (argv) => argv.some((arg) => arg === "--version" || arg === "-V" || arg === "-v");
export function formatCliBannerLine(version, options = {}) {
    const commit = options.commit ?? resolveCommitHash({ env: options.env });
    const commitLabel = commit ?? "unknown";
    const tagline = pickTagline(options);
    const rich = options.richTty ?? isRich();
    const title = "🦞 OpenClaw-CN";
    const prefix = "🦞 ";
    const columns = options.columns ?? process.stdout.columns ?? 120;
    const plainFullLine = `${title} ${version} (${commitLabel}) — ${tagline}`;
    const fitsOnOneLine = visibleWidth(plainFullLine) <= columns;
    if (rich) {
        if (fitsOnOneLine) {
            return `${theme.heading(title)} ${theme.info(version)} ${theme.muted(`(${commitLabel})`)} ${theme.muted("—")} ${theme.accentDim(tagline)}`;
        }
        const line1 = `${theme.heading(title)} ${theme.info(version)} ${theme.muted(`(${commitLabel})`)}`;
        const line2 = `${" ".repeat(prefix.length)}${theme.accentDim(tagline)}`;
        return `${line1}\n${line2}`;
    }
    if (fitsOnOneLine) {
        return plainFullLine;
    }
    const line1 = `${title} ${version} (${commitLabel})`;
    const line2 = `${" ".repeat(prefix.length)}${tagline}`;
    return `${line1}\n${line2}`;
}
const LOBSTER_ASCII = [
    "░████░████░░█████░█░░█░░████░█░░░░░█████░█░░░█░░░░████░█░░█░",
    "█░░░█░█░░░█░█████░██░█░░█░░░░█░░░░░█░░░█░█░░░█░░░█░░░░░██░█░",
    "█░░░█░████░░█████░█░██░░█░░░░█░░░░░█████░█░█░█░░░█░░░░░█░██░",
    "█░░░█░█░░░░░█░░░░░█░░█░░█░░░░█░░░░░█░░░█░█░█░█░░░█░░░░░█░░█░",
    "░████░█░░░░░█████░█░░█░░░████░█████░█░░░█░░█░█░░░░░████░█░░█░",
    "                   🦞 每日新鲜 🦞",
];
export function formatCliBannerArt(options = {}) {
    const rich = options.richTty ?? isRich();
    if (!rich)
        return LOBSTER_ASCII.join("\n");
    const colorChar = (ch) => {
        if (ch === "█")
            return theme.accentBright(ch);
        if (ch === "░")
            return theme.accentDim(ch);
        if (ch === "▀")
            return theme.accent(ch);
        return theme.muted(ch);
    };
    const colored = LOBSTER_ASCII.map((line) => {
        if (line.includes("每日新鲜")) {
            return (theme.muted("                   ") +
                theme.accent("🦞") +
                theme.info(" 每日新鲜 ") +
                theme.accent("🦞"));
        }
        return splitGraphemes(line).map(colorChar).join("");
    });
    return colored.join("\n");
}
export function emitCliBanner(version, options = {}) {
    if (bannerEmitted)
        return;
    const argv = options.argv ?? process.argv;
    if (!process.stdout.isTTY)
        return;
    if (hasJsonFlag(argv))
        return;
    if (hasVersionFlag(argv))
        return;
    const line = formatCliBannerLine(version, options);
    process.stdout.write(`\n${line}\n\n`);
    bannerEmitted = true;
}
export function hasEmittedCliBanner() {
    return bannerEmitted;
}
