import 'package:get_it/get_it.dart';
import 'package:holzleitner_api/holzleitner_api.dart';

import 'auth_token_provider.dart';
import 'backend_config.dart';
import 'holzleitner_api_factory.dart';
import 'keycloak_oidc_token_provider.dart';

/// Registriert das HTTP-/API-Subsystem im globalen GetIt-Locator.
///
/// Aufruf bewusst nicht im AppBloc-Lifecycle, sondern in `main()` vor
/// dem `runApp` — die API-Klassen sind über die gesamte App-Lebensdauer
/// stabil.
///
/// Phase B: produktiver `KeycloakOidcTokenProvider`. Die alte
/// `DevPasswordGrantTokenProvider`-Implementation bleibt im Code (für
/// das reine dart-Smoke-Tool, siehe `tool/smoke_test_api.dart`).
void registerNetworking({
  required GetIt locator,
  BackendConfig config = BackendConfig.fromEnvironment,
}) {
  locator.registerSingleton<BackendConfig>(config);

  final provider = KeycloakOidcTokenProvider(
    config: config,
    issuerUrl: config.keycloakIssuerUrl,
    redirectUrl: config.keycloakRedirectUrl,
  );
  // Doppelt registrieren: einmal unter der konkreten Klasse (für
  // den AuthBloc, der Login/Logout/Restore aufruft) und einmal hinter
  // dem Interface (für den HTTP-Interceptor).
  locator.registerSingleton<KeycloakOidcTokenProvider>(provider);
  locator.registerSingleton<AuthTokenProvider>(provider);

  locator.registerSingleton<HolzleitnerApi>(
    buildHolzleitnerApi(
      config: config,
      tokenProvider: locator<AuthTokenProvider>(),
    ),
  );
}
