/* auth.jsx — prihlásenie cez Microsoft (MSAL.js), vzor z PLUS Hubu.
   Vystavuje window.AUTA_AUTH = { login(), logout(), getApiToken(), getAccount(), ensureReady() }.
   Authorization Code + PKCE (MSAL to robí automaticky pre "spa" redirectUri).

   Klient nevolá Microsoft Graph vôbec (vzor Evidencie zariadení): pýta si LEN token pre vlastný
   backend (scope Auta.Access). Všetky dáta ide cez functions/api, ktoré overí token a rozhodne,
   čo smie prihlásený vidieť.
*/
(function () {
  "use strict";

  const cfg = window.AUTA_CONFIG;
  const API_SCOPES = [cfg.API_SCOPE];

  const msalInstance = new msal.PublicClientApplication({
    auth: {
      clientId: cfg.CLIENT_ID,
      authority: "https://login.microsoftonline.com/" + cfg.TENANT_ID,
      // Len origin, presne ako je zaregistrovaný Redirect URI v Entra ID
      // (https://firemne-auta.pages.dev a http://localhost:8791).
      redirectUri: window.location.origin,
      postLogoutRedirectUri: window.location.origin,
    },
    cache: {
      // localStorage, aby prihlásenie prežilo zatvorenie záložky na mobile (rovnaká voľba
      // a rovnaký kompromis ako Helpdesk a Hub).
      cacheLocation: "localStorage",
      storeAuthStateInCookie: false,
    },
  });

  // Redirect flow namiesto popup — popup je na mobile (hlavne Safari/iOS) nespoľahlivý.
  let ready = null;
  function ensureReady() {
    if (!ready) {
      ready = msalInstance.initialize()
        .then(() => msalInstance.handleRedirectPromise())
        .then((result) => { if (result && result.account) msalInstance.setActiveAccount(result.account); });
    }
    return ready;
  }

  function getAccount() {
    const active = msalInstance.getActiveAccount();
    if (active) return active;
    const accounts = msalInstance.getAllAccounts();
    if (accounts.length === 0) return null;
    msalInstance.setActiveAccount(accounts[0]);
    return accounts[0];
  }

  // Ak je človek už prihlásený do M365 (Outlook, Teams), Microsoft ho väčšinou pustí bez hesla.
  function login() {
    return msalInstance.loginRedirect({ scopes: API_SCOPES });
  }

  // Úplné odhlásenie aj z Microsoft relácie: na zdieľanom počítači nesmie ostať otvorená M365 relácia.
  function logout() {
    return msalInstance.logoutRedirect({ account: getAccount() });
  }

  async function getApiToken() {
    await ensureReady();
    const account = getAccount();
    if (!account) throw new Error("Nie ste prihlásený.");
    try {
      return (await msalInstance.acquireTokenSilent({ scopes: API_SCOPES, account })).accessToken;
    } catch (err) {
      if (err instanceof msal.InteractionRequiredAuthError) {
        await msalInstance.acquireTokenRedirect({ scopes: API_SCOPES, account });
        // Stránka sa prenavigovala na Microsoft: nikdy nevrátiť prázdny token, kým navigácia nedobehne.
        return new Promise(() => {});
      }
      throw err;
    }
  }

  window.AUTA_AUTH = { login, logout, getApiToken, getAccount, ensureReady };
})();
