"use server";

import { ObjectEncodingOptions, statSync } from "fs";
import { readdir } from "fs/promises";
import { join } from "path";

export async function capitalice(str: string) {
  return str.charAt(0).toUpperCase() + str.slice(1);
}

export async function scan_dir(
  pathlike: string,
  options?: ObjectEncodingOptions & {
    withFileTypes?: false | undefined;
    recursive?: boolean | undefined;
    orderBy?: {
      key: "name" | "time" | "size";
      mode: "asc" | "desc";
    };
  },
) {
  const orderBy = options?.orderBy;
  delete options?.orderBy;

  const files = await readdir(pathlike, options);

  const map: { name: string; time: number; size: number }[] = [];
  for (const filename of files) {
    const stats = statSync(join(pathlike, filename));

    const time = stats.mtime.getTime();
    const size = stats.size;

    map.push({
      name: filename,
      time,
      size,
    });
  }

  const sorted = map.sort((a, b) => {
    if (!orderBy || (orderBy?.key === "name" && orderBy.mode === "asc")) {
      return a.name
        .toLocaleLowerCase()
        .localeCompare(b.name.toLocaleLowerCase());
    }

    if (orderBy.key === "name") {
      return b.name
        .toLocaleLowerCase()
        .localeCompare(a.name.toLocaleLowerCase());
    }

    if (orderBy.mode === "asc") {
      return a[orderBy.key] - b[orderBy.key];
    }

    return b[orderBy.key] - a[orderBy.key];
  });

  return sorted;
}
