initializeFoldersCore function

Future<void> initializeFoldersCore()

Implementation

Future<void> initializeFoldersCore() async {
  final currentPath = path.join(Directory.current.path, 'lib/core');

  // 1. Check if core folder already exists
  final coreExists = await FileModifier.checkFolderExistenceAsync(
    folderPath: currentPath,
  );

  // Early exit to avoid deep nesting
  if (coreExists) {
    Logger.error("❌ Cannot create core folder: 'lib/core' already exists.");
    return;
  }

  try {
    Logger.info("🔄 Recreating pubspec.yaml...");
    await FileModifier.recreatePubspec();

    Logger.info("📂 Generating folders, files, and adding packages...");
    // 2. Run independent tasks concurrently for better performance
    await Future.wait([
      generateCoreBase(),
      initializeAddPackages(updatePackages: false),
      FileModifier.replaceFileContent(
        filePath: 'lib/main.dart',
        newContent: mainContent(),
      ),
      FileModifier.setupEnvFile(),
      FileModifier.replaceFileContent(
        filePath: 'assets/translations/ar-AR.json',
        newContent: arJsonContent(),
        createIfNotExists: true,
      ),
      FileModifier.replaceFileContent(
        filePath: 'assets/translations/en-US.json',
        newContent: enJsonContent(),
        createIfNotExists: true,
      ),
      FileModifier.createFolder('assets/icons/'),
      FileModifier.createFolder('assets/images/'),
    ]);

    // 3. Add assets to pubspec sequentially to avoid file write race conditions
    Logger.info("⚙️ Updating pubspec.yaml assets...");
    await FileModifier.addAssetToPubspec('.env');
    await FileModifier.addAssetToPubspec('assets/translations/');
    await FileModifier.addAssetToPubspec('assets/images/');
    await FileModifier.addAssetToPubspec('assets/icons/');

    // 4. Run CLI commands
    Logger.info("⏳ Running pub get...");
    await FileModifier.runPubGet(showResult: false);
    Logger.success("✅ Pub get completed.");

    // Fixed: Calling runBuildRunner instead of runPubUpgrade to match the logs
    Logger.info("⏳ Running Build Runner...");
    await FileModifier.runBuildRunner(showResult: false);
    Logger.success("✅ Build Runner completed.\n");

    // 5. Print success summary cleanly
    Logger.warning(
      "--------------------------------------------------------------",
    );
    Logger.success("✨ Core initialization completed successfully:");
    Logger.success("  *- Core folder created");
    Logger.success("  *- Main file updated");
    Logger.success(
      "  *- Assets (icons, images, translations) created and linked",
    );
    Logger.success("  *- Pubspec.yaml updated with packages and assets");
    Logger.warning(
      "--------------------------------------------------------------",
    );
  } catch (error) {
    // Log the error before rethrowing so the user knows exactly what failed
    Logger.error("❌ An error occurred during initialization: $error");
    rethrow;
  }
}