import { getCrypto } from "pkijs";

export const createDeviceHash = async publicKey => {
  try {
    const stringToEncode = publicKey + navigator.userAgent;
    const crypto = getCrypto();
    const buffer = new window.TextEncoder().encode(stringToEncode);
    const hash = await crypto.digest({ name: "SHA-1" }, buffer);
    return window.btoa(String.fromCharCode(...new Uint8Array(hash)));
  } catch (error) {
    console.warn(error); // eslint-disable-line no-console
  }
};

export const encodeResponse = (code, data, status) => {
  return {
    code,
    data,
    status
  };
};

export function makeid(len) {
  if (typeof len === "undefined") {
    len = 10;
  }
  var text = "";
  var possible =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

  for (var i = 0; i < len; i++)
    text += possible.charAt(Math.floor(Math.random() * possible.length));

  return text;
}

//*********************************************************************************
function getBlockFinishTimeInLocalStorage() {
  return localStorage.getItem("blockFinishTime") || getCurrentTime();
}

function getCurrentTime() {
  return Math.floor(new Date().getTime() / 1000);
}

export function getTimeLeftInLocalStorage() {
  const blockFinishTime = getBlockFinishTimeInLocalStorage();
  const timeNow = getCurrentTime();
  const seconds = (blockFinishTime - timeNow) % 60;
  let minutes = Math.floor((blockFinishTime - timeNow) / 60);
  minutes %= 60;

  const left =
    "Your identity has been locked. Try again in " +
    minutes +
    " minutes and " +
    seconds +
    " seconds.";
  return left;
}

export function listIdentitiesFromLocalStorage() {
  var serializedIdentitiesList = localStorage.getItem("identities");
  var identities = JSON.parse(serializedIdentitiesList);
  var identitiesResult = {};

  for (var key in identities) {
    var profile = JSON.parse(
      JSON.stringify(localStorage.getItem("profiles/" + key))
    );
    if (profile != null && profile !== "") {
      identitiesResult[key] = JSON.parse(profile);
    } else {
      identitiesResult[key] = {};
    }
  }

  return identitiesResult;
}

export function destroyIdentityFromLocalStorage(key) {
  localStorage.removeItem(key);
  localStorage.removeItem("profiles/" + key);
  localStorage.removeItem("colors/" + key);

  var serializedIdentitiesList = localStorage.getItem("identities");

  var identities = JSON.parse(serializedIdentitiesList);

  identities[key] = null;

  delete identities[key];

  localStorage.setItem("identities", JSON.stringify(identities));
}

export function failPincodeAttempt(password) {
  let message = "Wrong pincode";
  if (password !== "00000000") {
    let attempt = localStorage.getItem("attempt") || 1;
    attempt = parseInt(attempt);
    if (attempt === 9) {
      const identitiesTemp = listIdentitiesFromLocalStorage();
      for (let i in identitiesTemp) {
        destroyIdentityFromLocalStorage(i);
      }
      message = "9 failed attempts. Identity is revoked!";
      localStorage.removeItem("attempt");
    } else if (attempt % 3 === 0) {
      const timeNow = getCurrentTime();
      const blockFinishTime = timeNow + 300;
      localStorage.setItem("blockFinishTime", blockFinishTime);
      localStorage.setItem("attempt", attempt + 1);
      message = "3 failed attempts. Identity is locked!";
    } else {
      localStorage.setItem("attempt", attempt + 1);
    }
  }
  return message;
}

export function canTryPincode() {
  const timeNow = getCurrentTime();
  const blockFinishTime = getBlockFinishTimeInLocalStorage();
  if (blockFinishTime <= timeNow) {
    localStorage.removeItem("blockFinishTime");
    return true;
  } else {
    return false;
  }
}