import { getCrypto } from '../nodejs/crypto.mjs';
import { getFs } from '../nodejs/fs.mjs';
import { getOs } from '../nodejs/os.mjs';

/**
 * 写入文件
 * @param {string} file 文件地址
 * @param {any} data 文件数据
 * @param {boolean} [isJson] 是否需要 json 序列化
 * @example
 * ```ts
 * writeFileSync('a', 'b.txt', false);
 *
 * writeFileSync({ a: 1 }, 'b.json', true);
 * ```
 */
function writeFileSync(file, data) {
  var isJson = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  var _a;
  var fileData = isJson ? JSON.stringify(data, null, 2) : data;
  var eol = getOs().EOL || '\n';
  if (!((_a = fileData === null || fileData === void 0 ? void 0 : fileData.endsWith) === null || _a === void 0 ? void 0 : _a.call(fileData, eol))) {
    fileData += eol;
  }
  getFs().writeFileSync(file, fileData, {
    encoding: 'utf-8'
  });
}
/**
 * 读取文件
 * @param {string} file 文件地址
 * @param {boolean} [isJson] 是否需要 json 反序列化
 * @returns {any} 文件内容
 * @example
 * ```ts
 * readFileSync('b.txt', false);
 *
 * readFileSync('b.json', true);
 * ```
 */
function readFileSync(file) {
  var isJson = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  var content = getFs().readFileSync(file, {
    encoding: 'utf-8'
  });
  var result = content;
  if (isJson) {
    try {
      result = JSON.parse(content);
    } catch (e) {}
  }
  return result;
}
function isDirectory() {
  var filePath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  var stat = getFs().lstatSync(filePath);
  return stat.isDirectory();
}
function ensureDir(dir) {
  if (!getFs().existsSync(dir)) {
    getFs().mkdirSync(dir, {
      recursive: true
    });
  }
}
/**
 * 计算本地文件的哈希值
 * @param {string} filePath 文件路径
 * @param {'md5' | 'sha1' | 'sha256'} [algorithm='md5'] 哈希算法
 * @returns {string | null} 哈希值（hex 字符串）；文件不存在或读取失败时返回 null
 * @example
 * ```ts
 * const md5 = getLocalFileHash('/path/to/file');
 * const sha256 = getLocalFileHash('/path/to/file', 'sha256');
 * ```
 */
function getLocalFileHash(filePath) {
  var algorithm = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'md5';
  var fs = getFs();
  if (!filePath || !fs.existsSync(filePath)) {
    return null;
  }
  try {
    var buffer = fs.readFileSync(filePath);
    return getCrypto().createHash(algorithm).update(buffer).digest('hex');
  } catch (e) {
    return null;
  }
}
/**
 * 计算本地文件的 MD5
 * @param {string} filePath 文件路径
 * @returns {string | null} MD5 值（hex 字符串）；文件不存在或读取失败时返回 null
 * @example
 * ```ts
 * const md5 = getLocalFileMd5('/path/to/file');
 * ```
 */
function getLocalFileMd5(filePath) {
  return getLocalFileHash(filePath, 'md5');
}
/**
 * 获取本地文件大小（字节数）
 * @param {string} filePath 文件路径
 * @returns {number | null} 文件大小（字节）；文件不存在或读取失败时返回 null
 * @example
 * ```ts
 * const size = getLocalFileSize('/path/to/file');
 * ```
 */
function getLocalFileSize(filePath) {
  var fs = getFs();
  if (!filePath || !fs.existsSync(filePath)) {
    return null;
  }
  try {
    return fs.statSync(filePath).size;
  } catch (e) {
    return null;
  }
}

export { ensureDir, getLocalFileHash, getLocalFileMd5, getLocalFileSize, isDirectory, readFileSync, writeFileSync };
