"use strict";
import { ERR_INVALID_ARG_VALUE, ERR_INVALID_CURSOR_POS } from "../errors.ts";
import { validateCallback } from "../validators.mjs";
import { CSI } from "./utils.mjs";
const { kClearLine, kClearScreenDown, kClearToLineBeginning, kClearToLineEnd,} = CSI;
export function cursorTo(stream, x, y, callback) { if (callback !== undefined) { validateCallback(callback); }
if (typeof y === "function") { callback = y; y = undefined; }
if (Number.isNaN(x)) throw new ERR_INVALID_ARG_VALUE("x", x); if (Number.isNaN(y)) throw new ERR_INVALID_ARG_VALUE("y", y);
if (stream == null || (typeof x !== "number" && typeof y !== "number")) { if (typeof callback === "function") process.nextTick(callback, null); return true; }
if (typeof x !== "number") throw new ERR_INVALID_CURSOR_POS();
const data = typeof y !== "number" ? CSI`${x + 1}G` : CSI`${y + 1};${x + 1}H`; return stream.write(data, callback);}
export function moveCursor(stream, dx, dy, callback) { if (callback !== undefined) { validateCallback(callback); }
if (stream == null || !(dx || dy)) { if (typeof callback === "function") process.nextTick(callback, null); return true; }
let data = "";
if (dx < 0) { data += CSI`${-dx}D`; } else if (dx > 0) { data += CSI`${dx}C`; }
if (dy < 0) { data += CSI`${-dy}A`; } else if (dy > 0) { data += CSI`${dy}B`; }
return stream.write(data, callback);}
export function clearLine(stream, dir, callback) { if (callback !== undefined) { validateCallback(callback); }
if (stream === null || stream === undefined) { if (typeof callback === "function") process.nextTick(callback, null); return true; }
const type = dir < 0 ? kClearToLineBeginning : dir > 0 ? kClearToLineEnd : kClearLine; return stream.write(type, callback);}
export function clearScreenDown(stream, callback) { if (callback !== undefined) { validateCallback(callback); }
if (stream === null || stream === undefined) { if (typeof callback === "function") process.nextTick(callback, null); return true; }
return stream.write(kClearScreenDown, callback);}