initialize static method

Future<void> initialize(
  1. QuranKitConfig config
)

Initialize all enabled services based on config.

Safe to call multiple times — subsequent calls are no-ops. Throws if a required service fails to initialize.

Implementation

static Future<void> initialize(QuranKitConfig config) async {
  if (_initialized) return;

  _config = config;
  final tag = 'QuranKit';

  // ── 1. Inject custom storage if provided ──
  if (config.storage != null) {
    _injectStorage(config.storage!);
  }

  // ── 2. Core metadata (always required) ──
  log('Initializing QuranMetadata...', name: tag);
  await QuranMetadata.instance.init();

  // ── 3. Font pipeline ──
  if (config.fontBaseUrl.isNotEmpty) {
    log('Configuring FontDownloader: ${config.fontBaseUrl}', name: tag);
    FontDownloader.instance.configure(baseUrl: config.fontBaseUrl);
  }

  // ── 4. Settings (always needed — loads ValueNotifiers) ──
  log('Loading QuranSettingsService...', name: tag);
  await QuranSettingsService.instance.loadSettings();

  // Apply config defaults to settings only if they haven't been saved yet
  final settings = QuranSettingsService.instance;
  if (config.defaultEditionId != 'ar-uthmani') {
    await settings.setPreferredTranslation(config.defaultEditionId);
  }
  if (config.defaultTafsirId != 'al-tabari') {
    await settings.setPreferredTafsir(config.defaultTafsirId);
  }
  if (config.defaultQiraa != 'hafs') {
    await settings.setPreferredQiraa(config.defaultQiraa);
  }
  if (config.readingGoal != 20) {
    await settings.setReadingGoal(config.readingGoal);
  }
  if (config.showTajweed != true) {
    await settings.setShowTajweed(config.showTajweed);
  }

  // ── 5. Audio ──
  if (config.enableAudio) {
    log('Initializing QuranAudioService...', name: tag);
    await QuranAudioService.instance.init();
    if (config.defaultReciterIndex != 0) {
      QuranAudioService.instance.setReciter(config.defaultReciterIndex);
    }
  }

  // ── 6. Text / translations ──
  log('Initializing QuranTextService...', name: tag);
  await QuranTextService.instance.init();

  // ── 7. Tafsir ──
  if (config.enableTafsir) {
    log('Initializing QuranTafsirService...', name: tag);
    await QuranTafsirService.instance.init();
  }

  // ── 8. Word-by-word ──
  if (config.enableWordByWord) {
    log('Initializing QuranWordService...', name: tag);
    await QuranWordService.instance.init();
  }

  // ── 9. Asbab al-nuzul ──
  if (config.enableAsbabNuzul) {
    log('Initializing QuranAsbabNuzulService...', name: tag);
    await QuranAsbabNuzulService.instance.init();
  }

  // ── 10. Auto night mode ──
  if (config.enableAutoNightMode) {
    log('Enabling QuranAutoNightMode...', name: tag);
    await QuranAutoNightMode.instance.setEnabled(true);
    if (config.nightStartHour != 18 || config.nightEndHour != 6) {
      await QuranAutoNightMode.instance
          .setNightHours(config.nightStartHour, config.nightEndHour);
    }
  }

  // ── 11. Default theme ──
  if (config.defaultTheme != null) {
    QuranAutoNightMode.instance.currentTheme.value = config.defaultTheme!;
  }

  _initialized = true;
  log('QuranKit initialized successfully ✓', name: tag);
}