/**
 * Portabelt autentiseringsgränssnitt.
 *
 * App-koden (vyer, affärslogik) anropar ENDAST detta gränssnitt – aldrig
 * Firebase direkt. Firebase blir en implementation (FirebaseAuthProvider); en
 * framtida ZitadelAuthProvider ska kunna ersätta den utan att någon vy eller
 * affärslogik ändras. ALL leverantörsspecifik import (firebase/*) hålls
 * isolerad till implementationsfilen – aldrig här, aldrig i en vy.
 */

/** Minimal, leverantörsneutral användarrepresentation. */
export interface AuthUser {
  /** Stabil unik identitet från identitetsleverantören (Firebase-UID i dag). */
  uid: string;
  email: string | null;
  emailVerified: boolean;
  displayName: string | null;
  /** t.ex. "password" | "google.com" | "apple.com". Neutral sträng. */
  providerId: string | null;
}

/** Avregistreringsfunktion som returneras av onAuthStateChanged. */
export type Unsubscribe = () => void;

/**
 * Enda gränssnittet mot autentisering. Implementeras av FirebaseAuthProvider.
 * Alla nätverksmetoder är async och kastar vid fel (fångas i UI-lagret).
 */
export interface AuthProvider {
  signUpWithEmail(email: string, password: string): Promise<AuthUser>;
  signInWithEmail(email: string, password: string): Promise<AuthUser>;
  signInWithGoogle(): Promise<AuthUser>;
  signInWithApple(): Promise<AuthUser>;
  signOut(): Promise<void>;
  /** Skickar återställningsmejl för lösenord (leverantören sköter mejlet). */
  sendPasswordReset(email: string): Promise<void>;
  /** Nuvarande inloggade användare, eller null. Synkront ögonblicksvärde. */
  currentUser(): AuthUser | null;
  /** Prenumererar på inloggningsändringar. Returnerar avregistrering. */
  onAuthStateChanged(callback: (user: AuthUser | null) => void): Unsubscribe;
  /**
   * Hämtar aktuell ID-token för backend-verifiering. forceRefresh tvingar
   * förnyelse mot leverantören. null om ingen är inloggad.
   */
  getIdToken(forceRefresh?: boolean): Promise<string | null>;
}
