export const availableEncodings = [
  // encodings
  "utf-8",
  "ibm866",
  "iso-8859-2",
  "iso-8859-3",
  "iso-8859-4",
  "iso-8859-5",
  "iso-8859-6",
  "iso-8859-7",
  "iso-8859-8",
  "iso-8859-8-i",
  "iso-8859-10",
  "iso-8859-13",
  "iso-8859-14",
  "iso-8859-15",
  "iso-8859-16",
  "koi8-r",
  "koi8-u",
  "macintosh",
  "windows-874",
  "windows-1250",
  "windows-1251",
  "windows-1252",
  "windows-1253",
  "windows-1254",
  "windows-1255",
  "windows-1256",
  "windows-1257",
  "windows-1258",
  "x-mac-cyrillic",
  "gbk",
  "gb18030",
  "big5",
  "euc-jp",
  "iso-2022-jp",
  "shift_jis",
  "euc-kr",
  "utf-16be",
  "utf-16le",
  // label encodings
  "unicode-1-1-utf-8",
  "utf8",
  "866",
  "cp866",
  "csibm866",
  "csisolatin2",
  "iso-ir-101",
  "iso8859-2",
  "iso88592",
  "iso_8859-2",
  "iso_8859-2:1987",
  "l2",
  "latin2",
  "csisolatin3",
  "iso-ir-109",
  "iso8859-3",
  "iso88593",
  "iso_8859-3",
  "iso_8859-3:1988",
  "l3",
  "latin3",
  "csisolatin4",
  "iso-ir-110",
  "iso8859-4",
  "iso88594",
  "iso_8859-4",
  "iso_8859-4:1988",
  "l4",
  "latin4",
  "csisolatincyrillic",
  "cyrillic",
  "iso-ir-144",
  "iso88595",
  "iso_8859-5",
  "iso_8859-5:1988",
  "arabic",
  "asmo-708",
  "csiso88596e",
  "csiso88596i",
  "csisolatinarabic",
  "ecma-114",
  "iso-8859-6-e",
  "iso-8859-6-i",
  "iso-ir-127",
  "iso8859-6",
  "iso88596",
  "iso_8859-6",
  "iso_8859-6:1987",
  "csisolatingreek",
  "ecma-118",
  "elot_928",
  "greek",
  "greek8",
  "iso-ir-126",
  "iso8859-7",
  "iso88597",
  "iso_8859-7",
  "iso_8859-7:1987",
  "sun_eu_greek",
  "csiso88598e",
  "csisolatinhebrew",
  "hebrew",
  "iso-8859-8-e",
  "iso-ir-138",
  "iso8859-8",
  "iso88598",
  "iso_8859-8",
  "iso_8859-8:1988",
  "visual",
  "csiso88598i",
  "logical",
  "csisolatin6",
  "iso-ir-157",
  "iso8859-10",
  "iso885910",
  "l6",
  "latin6",
  "iso8859-13",
  "iso885913",
  "iso8859-14",
  "iso885914",
  "csisolatin9",
  "iso8859-15",
  "iso885915",
  "l9",
  "latin9",
  "cskoi8r",
  "koi",
  "koi8",
  "koi8_r",
  "csmacintosh",
  "mac",
  "x-mac-roman",
  "dos-874",
  "iso-8859-11",
  "iso8859-11",
  "iso885911",
  "tis-620",
  "cp1250",
  "x-cp1250",
  "cp1251",
  "x-cp1251",
  "ansi_x3.4-1968",
  "ascii",
  "cp1252",
  "cp819",
  "csisolatin1",
  "ibm819",
  "iso-8859-1",
  "iso-ir-100",
  "iso8859-1",
  "iso88591",
  "iso_8859-1",
  "iso_8859-1:1987",
  "l1",
  "latin1",
  "us-ascii",
  "x-cp1252",
  "cp1253",
  "x-cp1253",
  "cp1254",
  "csisolatin5",
  "iso-8859-9",
  "iso-ir-148",
  "iso8859-9",
  "iso88599",
  "iso_8859-9",
  "iso_8859-9:1989",
  "l5",
  "latin5",
  "x-cp1254",
  "cp1255",
  "x-cp1255",
  "cp1256",
  "x-cp1256",
  "cp1257",
  "x-cp1257",
  "cp1258",
  "x-cp1258",
  "x-mac-ukrainian",
  "chinese",
  "csgb2312",
  "csiso58gb231280",
  "gb2312",
  "gb_2312",
  "gb_2312-80",
  "iso-ir-58",
  "x-gbk",
  "big5-hkscs",
  "cn-big5",
  "csbig5",
  "x-x-big5",
  "cseucpkdfmtjapanese",
  "x-euc-jp",
  "csiso2022jp",
  "csshiftjis",
  "ms_kanji",
  "shift-jis",
  "sjis",
  "windows-31j",
  "x-sjis",
  "cseuckr",
  "csksc56011987",
  "iso-ir-149",
  "korean",
  "ks_c_5601-1987",
  "ks_c_5601-1989",
  "ksc5601",
  "ksc_5601",
  "windows-949",
  "utf-16",
];

export function decode(content: ArrayBuffer, encoding: string): string {
  const decoder = new TextDecoder(encoding);
  return decoder.decode(content);
}

export function isEncodableResponse(url: string): boolean {
  const extensions = [".csv"];

  if (typeof TextDecoder === "undefined") {
    return false;
  }

  for (const extension of extensions) {
    if (url.endsWith(extension)) {
      return true;
    }
  }

  return false;
}

export async function makeRawResource(
  res: Response,
  url: string
): Promise<Resource> {
  const buffer = await res.arrayBuffer();
  return {
    items: [],
    numDirs: 0,
    numFiles: 0,
    sorting: {} as Sorting,
    index: 0,
    extension: getExtension(url),
    isDir: false,
    isSymlink: false,
    path: url,
    size: buffer.byteLength,
    modified: new Date().toISOString(),
    name: url.split("/").pop() || "",
    type: "text",
    mode: 0,
    url: `/files${url}`,
    rawContent: buffer,
    content: decode(buffer, "utf-8"),
  };
}

function getExtension(url: string): string {
  const lastDotIndex = url.lastIndexOf(".");
  if (lastDotIndex === -1) {
    return "";
  }
  return url.substring(lastDotIndex);
}
