/**
 * Attus Token Manager — v2 simplificada.
 *
 * A extensao SEMPRE obtem o JWT do Attus via content script, que le
 * `localStorage.getItem('TOKEN')` na aba attus.pge.pe.gov.br e envia
 * junto com as mensagens LIGHT_GENERATE / GET_ATTUS_TOKEN. Logo, nao
 * precisamos mais do fluxo OAuth2 password grant — basta:
 *
 *   1. Preferir o `browserToken` recebido da aba (sempre mais fresco).
 *   2. Cachear o ultimo token valido em memoria para chamadas sucessivas
 *      do sidepanel que nao tenham um `browserToken` em maos (ex: "Incluir
 *      Manifestacao" disparada pelo proprio painel).
 *   3. Em caso de 401, o caller chama `invalidate()` e na proxima request
 *      pede um novo token ao content script via mensagem LIGHT_REQUEST_TOKEN.
 *
 * Nenhuma credencial do Attus fica armazenada em chrome.storage.local.
 */

const ATTUS_BASE = "https://attus.pge.pe.gov.br";
const X_TENANT = "PGEPE";

let _cachedToken = "";

/**
 * Headers padrao para requests JSON ao Attus.
 */
export function headersJson(token) {
  return {
    Authorization: `Bearer ${token}`,
    "Content-Type": "application/json",
    Accept: "application/json",
    "X-Tenant": X_TENANT,
  };
}

/**
 * Headers para download de arquivos do Attus.
 */
export function headersDownload(token) {
  return {
    Authorization: `Bearer ${token}`,
    "X-Tenant": X_TENANT,
  };
}

/**
 * Solicita ao service worker (via LIGHT_REQUEST_TOKEN) que pegue o token
 * atualizado do content script da aba Attus ativa. Usado como fallback
 * quando nenhum browserToken foi fornecido.
 *
 * @returns {Promise<string>}
 */
async function requestTokenFromActiveTab() {
  return new Promise((resolve) => {
    try {
      chrome.runtime.sendMessage({ type: "LIGHT_REQUEST_TOKEN" }, (response) => {
        resolve((response && response.token) || "");
      });
    } catch {
      resolve("");
    }
  });
}

/**
 * Retorna token Attus valido. Estrategia:
 *   1. Se `browserToken` foi fornecido (pelo LIGHT_GENERATE), usa-o e cacheia.
 *   2. Caso contrario, devolve o cache ultimo se existir.
 *   3. Caso contrario, tenta obter do content script da aba ativa.
 *   4. Falha com mensagem clara pedindo para recarregar o Attus.
 *
 * @param {string} [browserToken=""]
 * @returns {Promise<string>}
 */
export async function getToken(browserToken = "") {
  if (browserToken) {
    _cachedToken = browserToken;
    return browserToken;
  }
  if (_cachedToken) return _cachedToken;

  const token = await requestTokenFromActiveTab();
  if (token) {
    _cachedToken = token;
    return token;
  }

  throw new Error(
    "Nenhum token Attus disponivel. Abra o Attus (https://attus.pge.pe.gov.br) " +
    "em uma aba ativa, faca login e tente novamente."
  );
}

/**
 * Invalida o token em cache (ex: apos receber 401).
 */
export function invalidate() {
  _cachedToken = "";
  console.log("[attus-token] Token invalidado");
}

export { ATTUS_BASE, X_TENANT };
