import { promises, existsSync } from 'node:fs';
import { isAbsolute, resolve, dirname, join, basename } from 'pathe';

class NodeSnapshotEnvironment {
  constructor(options = {}) {
    this.options = options;
  }
  getVersion() {
    return "1";
  }
  getHeader() {
    return `// Snapshot v${this.getVersion()}`;
  }
  async resolveRawPath(testPath, rawPath) {
    return isAbsolute(rawPath) ? rawPath : resolve(dirname(testPath), rawPath);
  }
  async resolvePath(filepath) {
    return join(
      join(dirname(filepath), this.options.snapshotsDirName ?? "__snapshots__"),
      `${basename(filepath)}.snap`
    );
  }
  async prepareDirectory(dirPath) {
    await promises.mkdir(dirPath, { recursive: true });
  }
  async saveSnapshotFile(filepath, snapshot) {
    await promises.mkdir(dirname(filepath), { recursive: true });
    await promises.writeFile(filepath, snapshot, "utf-8");
  }
  async readSnapshotFile(filepath) {
    if (!existsSync(filepath)) {
      return null;
    }
    return promises.readFile(filepath, "utf-8");
  }
  async removeSnapshotFile(filepath) {
    if (existsSync(filepath)) {
      await promises.unlink(filepath);
    }
  }
}

export { NodeSnapshotEnvironment };