import { TOTP } from "../../lib/totp-quickjs";

const otpScheme = "otpauth:/";

export function getTOTPByLink(link) {
  try {
    let args = link.split("/", otpScheme.length);
    let type = args[2]; //Returns 'hotp' or 'totp'
    let issuer = args[3].split(":")[0]?.split("?")[0]; //Returns issuer
    let client =
      args[3].split(":")[1]?.split("?")[0] ??
      args[3].split(":")[0]?.split("?")[0]; //Returns client
    let secret = args[3].split("secret=")[1]?.split("&")[0]; //Returns secret
    let period = args[3].split("period=")[1]?.split("&")[0]; //Returns period
    let digits = args[3].split("digits=")[1]?.split("&")[0]; //Returns digits
    let algorithm = args[3].split("algorithm=")[1]?.split("&")[0]; //Returns algorithm

    if (type.toLowerCase() != "totp")
      throw new Error("Type is not valid, requires 'TOTP'");

    if (secret === undefined) throw new Error("Secret not defined");

    issuer = issuer.replace("%20", " ");
    client = client.replace("%20", " ");

    return new TOTP(
      secret,
      issuer,
      client,
      digits,
      period,
      0,
      getHashType(algorithm)
    );
  } catch (err) {
    return null;
  }
}

function getHashType(algorithm) {
  if (algorithm == "SHA1") return "SHA-1";
  if (algorithm == "SHA256") return "SHA-256";
  if (algorithm == "SHA512") return "SHA-512";
  else return "SHA-1";
}