import { t } from "../i18n";

// 字节数→可读字符串（语言无关，单位是国际通用 SI 简写）。
export function formatBytes(bytes: number): string
{
    if (bytes < 1024) { return `${bytes} B`; }
    if (bytes < 1024 * 1024) { return `${( bytes / 1024 ).toFixed(1)} KB`; }
    if (bytes < 1024 * 1024 * 1024) { return `${( bytes / 1024 / 1024 ).toFixed(1)} MB`; }
    return `${( bytes / 1024 / 1024 / 1024 ).toFixed(2)} GB`;
}

// 设备名称全局限制为 ASCII：名字要塞进 X-Device-Name 这个 HTTP 头，非 ASCII 在
// 浏览器 fetch 里会直接抛错、也无法可靠传输，故输入处校验、传输前兜底剥离。
const ASCII_DEVICE_NAME = /^[\x20-\x7E]*$/;

// isAsciiDeviceName 判断名字是否仅由可打印 ASCII 组成（输入校验用）。
export function isAsciiDeviceName(name: string): boolean
{
    return ASCII_DEVICE_NAME.test(name);
}

// toAsciiDeviceName 剥掉非可打印 ASCII 并 trim，与后端 sanitizeDeviceName 对齐——
// 给旧的非 ASCII 名字兜底，避免设进 X-Device-Name 头时 fetch 抛错。
export function toAsciiDeviceName(name: string): string
{
    let out = "";
    for (const ch of name)
    {
        const c = ch.codePointAt(0) ?? 0;
        if (c >= 0x20 && c <= 0x7e) { out += ch; }
    }
    return out.trim();
}

// 相对时间（"刚刚" / "5 分钟前"）。> 1 天回退到本地化的绝对日期时间。
export function formatRelative(epochSec: number): string
{
    if (!epochSec) { return ""; }
    const sec = Math.floor(Date.now() / 1000) - epochSec;
    if (sec < 5) { return t("time.justNow"); }
    if (sec < 60) { return t("time.secondsAgo", { n: sec }); }
    if (sec < 3600) { return t("time.minutesAgo", { n: Math.floor(sec / 60) }); }
    if (sec < 86400) { return t("time.hoursAgo", { n: Math.floor(sec / 3600) }); }
    return new Date(epochSec * 1000).toLocaleString();
}
