/**
 * Async File System Helpers for DashCaddy
 * Replaces common sync patterns with async equivalents.
 */

const fsp = require('fs').promises;
const fs = require('fs');

/**
 * Async file existence check (replaces fs.existsSync)
 */
async function exists(filePath) {
  try {
    await fsp.access(filePath);
    return true;
  } catch {
    return false;
  }
}

/**
 * Read and parse a JSON file with fallback (replaces existsSync + readFileSync + JSON.parse)
 */
async function readJsonFile(filePath, fallback = null) {
  try {
    const content = await fsp.readFile(filePath, 'utf8');
    return JSON.parse(content);
  } catch (e) {
    if (e.code === 'ENOENT') return fallback;
    throw e;
  }
}

/**
 * Write data as formatted JSON (replaces writeFileSync + JSON.stringify)
 */
async function writeJsonFile(filePath, data) {
  await fsp.writeFile(filePath, JSON.stringify(data, null, 2), 'utf8');
}

/**
 * Read a text file with fallback (replaces existsSync + readFileSync)
 */
async function readTextFile(filePath, fallback = '') {
  try {
    return await fsp.readFile(filePath, 'utf8');
  } catch (e) {
    if (e.code === 'ENOENT') return fallback;
    throw e;
  }
}

/**
 * Check if path is accessible with given mode (replaces accessSync)
 */
async function isAccessible(filePath, mode = fs.constants.R_OK) {
  try {
    await fsp.access(filePath, mode);
    return true;
  } catch {
    return false;
  }
}

module.exports = { exists, readJsonFile, writeJsonFile, readTextFile, isAccessible };
