/// Events des AuthBloc.
///
/// Eingehende Events (Trigger): `LoginRequested`, `LogoutRequested`,
/// `RestoreSessionRequested`.
///
/// Stream-Events vom `KeycloakOidcTokenProvider` werden über
/// `ProviderSessionChanged` in den Bloc-Bus übersetzt — damit alles
/// in der `on<...>`-Maschinerie des Blocs verarbeitet werden kann.
sealed class AuthEvent {
  const AuthEvent();
}

/// Vom UI ausgelöst — startet den PKCE-Login-Flow.
final class LoginRequested extends AuthEvent {
  const LoginRequested();
}

/// Vom UI ausgelöst — beendet die Session.
final class LogoutRequested extends AuthEvent {
  const LogoutRequested();
}

/// Vom App-Bootstrap ausgelöst — prüft, ob es einen persistierten
/// Refresh-Token gibt, und stellt die Session ggf. wieder her.
final class RestoreSessionRequested extends AuthEvent {
  const RestoreSessionRequested();
}

/// Interner Event-Typ — Brücke vom Token-Provider-Stream in die
/// Bloc-Maschine.
final class ProviderSessionChanged extends AuthEvent {
  const ProviderSessionChanged(this.kind, {this.claims, this.accessToken});

  final ProviderEventKind kind;
  final Map<String, dynamic>? claims;
  final String? accessToken;
}

enum ProviderEventKind { loggedIn, loggedOut, sessionExpired }

/// Legacy-Event: Wird von den alten ERPframe-Repositories gefeuert,
/// wenn der Server mit 401 antwortet. Mit Phase D fliegt das raus,
/// weil 401 dann direkt vom `HolzleitnerAuthInterceptor` ausgewertet
/// und an den Provider gemeldet wird.
final class SessionExpiredEvent extends AuthEvent {
  const SessionExpiredEvent();
}

