// ============================================================
// text-input-ops.ts — 文本输入框通用操作工具
//
// 提供撤销/重做/剪切/复制/粘贴/清空/全选等标准操作，
// 操作当前聚焦的 input/textarea 元素。
//
// 用于 text-input-menu 的回调实现，避免在 JSX 中写 DOM 操作。
// ============================================================

/** 获取当前聚焦的输入元素，且仅在 input/textarea 类型时返回 */
function getFocusedInput(): HTMLInputElement | HTMLTextAreaElement | null {
    const el = document.activeElement;
    if (!el) return null;
    const tag = el.tagName;
    if (tag === 'INPUT' || tag === 'TEXTAREA') {
        return el as HTMLInputElement | HTMLTextAreaElement;
    }
    // contenteditable 也算可编辑区域
    if ((el as HTMLElement).isContentEditable) {
        return el as HTMLElement as HTMLTextAreaElement; // 近似，execCommand 兼容
    }
    return null;
}

export function execUndo() {
    document.execCommand('undo');
}

export function execRedo() {
    document.execCommand('redo');
}

export function execCut() {
    document.execCommand('cut');
}

export function execCopy() {
    document.execCommand('copy');
}

export function execPaste() {
    document.execCommand('paste');
}

export function execClear() {
    const el = getFocusedInput();
    if (!el) return;
    // 记录撤销点
    el.focus();
    document.execCommand('selectAll');
    document.execCommand('delete');
}

export function execSelectAll() {
    const el = getFocusedInput();
    if (!el) return;
    el.focus();
    el.select();
}

/** 检查当前聚焦输入框是否有选中文本 */
export function hasTextSelection(): boolean {
    const el = getFocusedInput();
    if (!el) return false;
    return el.selectionStart !== el.selectionEnd;
}

/** 检查当前聚焦输入框是否为空 */
export function isInputEmpty(): boolean {
    const el = getFocusedInput();
    if (!el) return true;
    return el.value.length === 0;
}

// ── 字号管理 ──

const DEFAULT_FONT_SIZE = 14;
const FONT_STEP = 2;
const FONT_MIN = 10;
const FONT_MAX = 28;

/** 获取当前输入框字号（或返回默认值） */
export function getFontSize(): number {
    const el = getFocusedInput();
    if (!el) return DEFAULT_FONT_SIZE;
    const current = parseInt(window.getComputedStyle(el).fontSize, 10);
    return Number.isNaN(current) ? DEFAULT_FONT_SIZE : current;
}

/** 计算字号偏移级别（相对于默认值，每级 ±FONT_STEP px） */
export function getFontSizeLevel(): number {
    const size = getFontSize();
    return Math.round((size - DEFAULT_FONT_SIZE) / FONT_STEP);
}

export function execIncreaseFont() {
    const el = getFocusedInput();
    if (!el) return;
    const current = getFontSize();
    const next = Math.min(FONT_MAX, current + FONT_STEP);
    if (next !== current) {
        el.style.fontSize = `${next}px`;
    }
}

export function execDecreaseFont() {
    const el = getFocusedInput();
    if (!el) return;
    const current = getFontSize();
    const next = Math.max(FONT_MIN, current - FONT_STEP);
    if (next !== current) {
        el.style.fontSize = `${next}px`;
    }
}

export function execResetFont() {
    const el = getFocusedInput();
    if (!el) return;
    el.style.fontSize = '';
}
