// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.

import { fstat, fstatSync } from "node:fs";
import { fail } from "@std/assert";
import { assertStats, assertStatsBigInt } from "./_fs_stat_test.ts";
import type { BigIntStats, Stats } from "node:fs";

Deno.test({
  name: "ASYNC: get a file Stats",
  // TODO(bartlomieju): this test is broken in Deno 2, because `file.rid` is undefined.
  // The fs APIs should be rewritten to use actual FDs, not RIDs
  ignore: true,
  async fn() {
    const filePath = await Deno.makeTempFile();
    using file = await Deno.open(filePath);

    await new Promise<Stats>((resolve, reject) => {
      // @ts-ignore (iuioiua) `file.rid` should no longer be needed once FDs are used
      fstat(file.rid, (err: Error | null, stat: Stats) => {
        if (err) reject(err);
        resolve(stat);
      });
    })
      .then(
        (stat) => {
          assertStats(stat, file.statSync());
        },
        () => fail(),
      )
      .finally(() => {
        Deno.removeSync(filePath);
      });
  },
});

Deno.test({
  name: "ASYNC: get a file BigInt Stats",
  // TODO(bartlomieju): this test is broken in Deno 2, because `file.rid` is undefined.
  // The fs APIs should be rewritten to use actual FDs, not RIDs
  ignore: true,
  async fn() {
    const filePath = await Deno.makeTempFile();
    using file = await Deno.open(filePath);

    await new Promise<BigIntStats>((resolve, reject) => {
      fstat(
        // @ts-ignore (iuioiua) `file.rid` should no longer be needed once FDs are used
        file.rid,
        { bigint: true },
        (err: Error | null, stat: BigIntStats) => {
          if (err) reject(err);
          resolve(stat);
        },
      );
    })
      .then(
        (stat) => assertStatsBigInt(stat, file.statSync()),
        () => fail(),
      )
      .finally(() => {
        Deno.removeSync(filePath);
      });
  },
});

Deno.test({
  name: "SYNC: get a file Stats",
  // TODO(bartlomieju): this test is broken in Deno 2, because `file.rid` is undefined.
  // The fs APIs should be rewritten to use actual FDs, not RIDs
  ignore: true,
  fn() {
    const filePath = Deno.makeTempFileSync();
    using file = Deno.openSync(filePath);

    try {
      // @ts-ignore (iuioiua) `file.rid` should no longer be needed once FDs are used
      assertStats(fstatSync(file.rid), file.statSync());
    } finally {
      Deno.removeSync(filePath);
    }
  },
});

Deno.test({
  name: "SYNC: get a file BigInt Stats",
  // TODO(bartlomieju): this test is broken in Deno 2, because `file.rid` is undefined.
  // The fs APIs should be rewritten to use actual FDs, not RIDs
  ignore: true,
  fn() {
    const filePath = Deno.makeTempFileSync();
    using file = Deno.openSync(filePath);

    try {
      // HEAD
      // @ts-ignore (iuioiua) `file.rid` should no longer be needed once FDs are used
      assertStatsBigInt(fstatSync(file.rid, { bigint: true }), file.statSync());
      //
      assertStatsBigInt(
        // @ts-ignore (iuioiua) `file.rid` should no longer be needed once FDs are used
        fstatSync(file.rid, { bigint: true }),
        file.statSync(),
      );
      //main
    } finally {
      Deno.removeSync(filePath);
    }
  },
});