import { execFile as execFileOriginal } from "node:child_process";
import { ExecFileFn } from "./types";

export const properties = {
  from: {
    image: [
      "3fr",
      "8bim",
      "8bimtext",
      "8bimwtext",
      "app1",
      "app1jpeg",
      "art",
      "arw",
      "avs",
      "b",
      "bie",
      "bigtiff",
      "bmp",
      "c",
      "cals",
      "caption",
      "cin",
      "cmyk",
      "cmyka",
      "cr2",
      "crw",
      "cur",
      "cut",
      "dcm",
      "dcr",
      "dcx",
      "dng",
      "dpx",
      "epdf",
      "epi",
      "eps",
      "epsf",
      "epsi",
      "ept",
      "ept2",
      "ept3",
      "erf",
      "exif",
      "fax",
      "file",
      "fits",
      "fractal",
      "ftp",
      "g",
      "gif",
      "gif87",
      "gradient",
      "gray",
      "graya",
      "heic",
      "heif",
      "hrz",
      "http",
      "icb",
      "icc",
      "icm",
      "ico",
      "icon",
      "identity",
      "image",
      "iptc",
      "iptctext",
      "iptcwtext",
      "jbg",
      "jbig",
      "jng",
      "jnx",
      "jpeg",
      "jpg",
      "k",
      "k25",
      "kdc",
      "label",
      "m",
      "mac",
      "map",
      "mat",
      "mef",
      "miff",
      "mng",
      "mono",
      "mpc",
      "mrw",
      "msl",
      "mtv",
      "mvg",
      "nef",
      "null",
      "o",
      "orf",
      "otb",
      "p7",
      "pal",
      "palm",
      "pam",
      "pbm",
      "pcd",
      "pcds",
      "pct",
      "pcx",
      "pdb",
      "pdf",
      "pef",
      "pfa",
      "pfb",
      "pgm",
      "picon",
      "pict",
      "pix",
      "plasma",
      "png",
      "png00",
      "png24",
      "png32",
      "png48",
      "png64",
      "png8",
      "pnm",
      "ppm",
      "ps",
      "ptif",
      "pwp",
      "r",
      "raf",
      "ras",
      "rgb",
      "rgba",
      "rla",
      "rle",
      "sct",
      "sfw",
      "sgi",
      "sr2",
      "srf",
      "stegano",
      "sun",
      "svg",
      "svgz",
      "text",
      "tga",
      "tif",
      "tiff",
      "tile",
      "tim",
      "topol",
      "ttf",
      "txt",
      "uyvy",
      "vda",
      "vicar",
      "vid",
      "viff",
      "vst",
      "wbmp",
      "webp",
      "wmf",
      "wpg",
      "x3f",
      "xbm",
      "xc",
      "xcf",
      "xmp",
      "xpm",
      "xv",
      "xwd",
      "y",
      "yuv",
    ],
  },
  to: {
    image: [
      "8bim",
      "8bimtext",
      "8bimwtext",
      "app1",
      "app1jpeg",
      "art",
      "avs",
      "b",
      "bie",
      "bigtiff",
      "bmp",
      "bmp2",
      "bmp3",
      "brf",
      "c",
      "cals",
      "cin",
      "cmyk",
      "cmyka",
      "dcx",
      "dpx",
      "epdf",
      "epi",
      "eps",
      "eps2",
      "eps3",
      "epsf",
      "epsi",
      "ept",
      "ept2",
      "ept3",
      "exif",
      "fax",
      "fits",
      "g",
      "gif",
      "gif87",
      "gray",
      "graya",
      "histogram",
      "html",
      "icb",
      "icc",
      "icm",
      "info",
      "iptc",
      "iptctext",
      "iptcwtext",
      "isobrl",
      "isobrl6",
      "jbg",
      "jbig",
      "jng",
      "jpeg",
      "k",
      "m",
      "m2v",
      "map",
      "mat",
      "matte",
      "miff",
      "mng",
      "mono",
      "mpc",
      "mpeg",
      "mpg",
      "msl",
      "mtv",
      "mvg",
      "null",
      "o",
      "otb",
      "p7",
      "pal",
      "pam",
      "pbm",
      "pcd",
      "pcds",
      "pcl",
      "pct",
      "pcx",
      "pdb",
      "pdf",
      "pgm",
      "picon",
      "pict",
      "png",
      "png00",
      "png24",
      "png32",
      "png48",
      "png64",
      "png8",
      "pnm",
      "ppm",
      "preview",
      "ps",
      "ps2",
      "ps3",
      "ptif",
      "r",
      "ras",
      "rgb",
      "rgba",
      "sgi",
      "shtml",
      "sun",
      "text",
      "tga",
      "tiff",
      "txt",
      "ubrl",
      "ubrl6",
      "uil",
      "uyvy",
      "vda",
      "vicar",
      "vid",
      "viff",
      "vst",
      "wbmp",
      "webp",
      "x",
      "xbm",
      "xmp",
      "xpm",
      "xv",
      "xwd",
      "y",
      "yuv",
    ],
  },
};

export function convert(
  filePath: string,
  fileType: string,
  convertTo: string,
  targetPath: string,
  options?: unknown,
  execFile: ExecFileFn = execFileOriginal, // to make it mockable
): Promise<string> {
  return new Promise((resolve, reject) => {
    execFile("gm", ["convert", filePath, targetPath], (error, stdout, stderr) => {
      if (error) {
        reject(`error: ${error}`);
      }

      if (stdout) {
        console.log(`stdout: ${stdout}`);
      }

      if (stderr) {
        console.error(`stderr: ${stderr}`);
      }

      resolve("Done");
    });
  });
}
