handleFirebaseSetupFull function

Future<void> handleFirebaseSetupFull()

End-to-end Firebase setup. Runs every applicable sub-step (auth, billing, FlutterFire / Jaspr JS SDK, Firestore + Storage init, auth providers hand-off, rules deploy, web build, hosting init, hosting release + beta deploy, and — when the project enabled it — Cloud Run / Artifact Registry cleanup).

Idempotent: any sub-step that already ran cleanly short-circuits.

Implementation

Future<void> handleFirebaseSetupFull() async {
  if (!await _ensureProjectConfigOrHelp()) {
    return;
  }
  final SetupConfig config = (await ProjectConfigLoader.load())!;

  print('');
  UserPrompt.printDivider(title: 'Firebase end-to-end setup');
  UserPrompt.printList(<String>[
    'Project: ${config.firebaseProjectId}',
    'Template: ${config.template.name}',
    if (SetupGuidance.supportsWebHosting(config)) 'Web hosting: enabled',
    if (config.createServer) 'Server (Cloud Run): enabled',
  ]);
  print('');

  final FirebaseSetupOrchestrator orchestrator = FirebaseSetupOrchestrator(
    config,
  );

  final OrchestratorReport report = await orchestrator.runAll(
    interactive: true,
    onStep: (SetupStepResult result) async {
      switch (result.status) {
        case SetupStepStatus.success:
          success(
            '${result.step.label}'
            '${result.message.isNotEmpty ? ' — ${result.message}' : ''}',
          );
          break;
        case SetupStepStatus.skipped:
          warn(
            '${result.step.label} skipped'
            '${result.message.isNotEmpty ? ': ${result.message}' : ''}',
          );
          break;
        case SetupStepStatus.failed:
          error(
            '${result.step.label} failed'
            '${result.message.isNotEmpty ? ': ${result.message}' : ''}',
          );
          break;
      }
    },
  );

  print('');
  UserPrompt.printDivider(title: 'Setup summary');
  UserPrompt.printList(<String>[
    'Steps succeeded: ${report.successCount}',
    'Steps skipped:   ${report.skippedCount}',
    'Steps failed:    ${report.failedCount}',
  ]);

  if (report.releaseUrl != null || report.betaUrl != null) {
    print('');
    UserPrompt.printDivider(title: 'What was deployed');
    UserPrompt.printList(<String>[
      if (report.releaseUrl != null) 'Release URL: ${report.releaseUrl}',
      if (report.betaUrl != null) 'Beta URL: ${report.betaUrl}',
      if (report.firestoreRegion != null)
        SetupGuidance.linkLine(
          'Firestore console',
          FirebaseInitializer.firestoreConsoleUrl(config.firebaseProjectId!),
        ),
      if (report.storageBucketName != null)
        SetupGuidance.linkLine(
          'Storage console',
          FirebaseInitializer.getStartedUrl(config.firebaseProjectId!),
        ),
      if (config.setupCloudRun)
        SetupGuidance.linkLine(
          'Cloud Run console',
          SetupGuidance.cloudRunConsoleUrl(config.firebaseProjectId!),
        ),
    ]);
  }

  if (report.failures.isNotEmpty) {
    print('');
    UserPrompt.printDivider(title: 'Failures (re-runnable)');
    for (final SetupStepResult fail in report.failures) {
      UserPrompt.printList(<String>[
        '${fail.step.label}: ${fail.message}',
        if (fail.fixHint.isNotEmpty) '  Fix: ${fail.fixHint}',
      ]);
    }
  }

  if (!report.success) {
    print('');
    error(
      'Firebase setup completed with ${report.failedCount} failing step(s). '
      'Re-run individual commands above to retry.',
    );
  } else if (report.skippedCount > 0) {
    print('');
    info('Firebase setup completed (some steps were skipped).');
  } else {
    print('');
    success('Firebase setup complete!');
  }
}