/**
 * Zentrales Appwrite Client Setup
 * Stellt Client, Account, Databases Instanzen und Helper-Funktionen bereit
 */

import { Client, Account, Databases } from "appwrite";

// Konfiguration aus Environment-Variablen oder Defaults
const endpoint = import.meta.env.VITE_APPWRITE_ENDPOINT || "https://appwrite.webklar.com/v1";
const projectId = import.meta.env.VITE_APPWRITE_PROJECT_ID || "696b82bb0036d2e547ad";
const databaseId = import.meta.env.VITE_APPWRITE_DATABASE_ID || "eship-db";
const usersCollectionId = import.meta.env.VITE_APPWRITE_USERS_COLLECTION_ID || "users";
const accountsCollectionId = import.meta.env.VITE_APPWRITE_ACCOUNTS_COLLECTION_ID || "accounts";

// Client initialisieren
const client = new Client()
  .setEndpoint(endpoint)
  .setProject(projectId);

// Service-Instanzen
const account = new Account(client);
const databases = new Databases(client);

/**
 * Gibt den aktuell eingeloggten User zurück
 * @returns {Promise<Object|null>} User-Objekt oder null
 */
export async function getAuthUser() {
  try {
    const user = await account.get();
    return user;
  } catch (e) {
    // Session nicht vorhanden oder abgelaufen
    if (e.code === 401 || e.type === 'general_unauthorized_scope') {
      return null;
    }
    console.warn("Fehler beim Abrufen des Users:", e);
    return null;
  }
}

/**
 * Prüft ob eine gültige Session existiert und leitet ggf. zum Login um
 * @param {Function} navigate - Navigations-Funktion (z.B. von useHashRoute)
 * @param {string} loginRoute - Route zum Login (default: "/")
 * @returns {Promise<Object|null>} User-Objekt oder null (wenn nicht eingeloggt)
 */
export async function ensureSessionOrRedirect(navigate, loginRoute = "/") {
  const user = await getAuthUser();
  if (!user && navigate) {
    // Redirect zu Login (aktuell noch kein separater Login-Route, daher "/")
    // TODO: Wenn Login-Route existiert, hier verwenden
    navigate(loginRoute);
  }
  return user;
}

// Exports
export { client, account, databases, databaseId, usersCollectionId, accountsCollectionId };
