execute method

Future<void> execute()

Implementation

Future<void> execute() async {
  final snakeFeatureName = StringUtils.toSnakeCase(featureName);
  final snakePageName = StringUtils.toSnakeCase(pageName);
  final pascalPageName = StringUtils.toPascalCase(pageName);

  // Check if running from project root
  final currentDir = Directory.current.path;
  final melosFile = File('$currentDir/melos.yaml');
  final packagesDir = Directory('$currentDir/packages');

  if (!melosFile.existsSync() || !packagesDir.existsSync()) {
    Logger.error(
      '❌ Please run this command from the project root directory!',
    );
    Logger.error(
      '   (The directory containing melos.yaml and packages/ folder)',
    );
    print('');
    print('Current directory: $_cyan$currentDir$_reset');
    print('Expected files: ${_cyan}melos.yaml, packages/$_reset');
    exit(1);
  }

  Logger.header(
      'Removing Page: $snakePageName from feature: $snakeFeatureName');

  // Check if feature exists
  final featurePath = '$currentDir/packages/features_$snakeFeatureName';
  final featureDir = Directory(featurePath);

  if (!featureDir.existsSync()) {
    Logger.error('Feature "features_$snakeFeatureName" does not exist!');
    Logger.warning('Available features:');
    final packagesDirectory = Directory('$currentDir/packages');
    await for (var entity in packagesDirectory.list()) {
      if (entity is Directory && entity.path.contains('features_')) {
        final name = entity.path.split('/').last;
        Logger.warning('  • $name');
      }
    }
    exit(1);
  }

  // Check if page exists
  final pageFile =
      File('$featurePath/lib/presentation/pages/${snakePageName}_page.dart');
  if (!pageFile.existsSync()) {
    Logger.error(
        'Page "${snakePageName}_page.dart" does not exist in features_$snakeFeatureName!');
    Logger.warning('Available pages:');
    final pagesDir = Directory('$featurePath/lib/presentation/pages');
    if (pagesDir.existsSync()) {
      await for (var entity in pagesDir.list()) {
        if (entity is File && entity.path.endsWith('_page.dart')) {
          final name = entity.path.split('/').last;
          Logger.warning('  • $name');
        }
      }
    }
    exit(1);
  }

  // Detect what was generated with the page
  final blocFile =
      File('$featurePath/lib/presentation/bloc/${snakePageName}_bloc.dart');
  final entityFile =
      File('$featurePath/lib/domain/entities/${snakePageName}_entity.dart');

  final hasBloc = blocFile.existsSync();
  final hasData = entityFile.existsSync();

  // Ask for confirmation
  print('');
  print('$_red⚠️  WARNING: This will permanently delete:$_reset');
  print('   • Page: ${snakePageName}_page.dart');
  if (hasBloc) {
    print(
        '   • BLoC files: ${snakePageName}_bloc.dart, ${snakePageName}_event.dart, ${snakePageName}_state.dart');
  }
  if (hasData) {
    print('   • Domain layer: entity, repository, use case');
    print('   • Data layer: model, datasource, repository implementation');
  }
  print('   • Exports from barrel file');
  print('');
  stdout.write('Are you sure you want to continue? (yes/no): ');
  final confirmation = stdin.readLineSync()?.toLowerCase().trim();

  if (confirmation != 'yes' && confirmation != 'y') {
    Logger.warning('Operation cancelled.');
    exit(0);
  }

  print('');

  try {
    // Remove page file
    Logger.step('Removing page file...');
    pageFile.deleteSync();
    Logger.success('Removed ${snakePageName}_page.dart');

    // Remove BLoC files if they exist
    if (hasBloc) {
      Logger.step('Removing BLoC files...');
      _removeBlocFiles(featurePath, snakePageName);
      Logger.success('Removed BLoC files');
    }

    // Remove data and domain layers if they exist
    if (hasData) {
      Logger.step('Removing domain layer...');
      _removeDomainLayer(featurePath, snakePageName);
      Logger.success('Removed domain layer');

      Logger.step('Removing data layer...');
      _removeDataLayer(featurePath, snakePageName);
      Logger.success('Removed data layer');
    }

    // Update barrel exports
    Logger.step('Updating barrel exports...');
    _removeFromBarrelExports(
        featurePath, snakePageName, snakeFeatureName, hasBloc, hasData);
    Logger.success('Updated barrel exports');

    // Remove route from app_routes.dart
    Logger.step('Removing route from app_routes.dart...');
    _removeRouteFromAppRoutes(currentDir, snakePageName, pascalPageName);
    Logger.success('Removed route from app_routes.dart');

    // Remove route from app_router.dart
    Logger.step('Removing route from app_router.dart...');
    _removeRouteFromAppRouter(currentDir, snakePageName, pascalPageName);
    Logger.success('Removed route from app_router.dart');

    // Remove from dependency injection
    if (hasBloc) {
      Logger.step('Removing from dependency injection...');
      _removeFromDI(currentDir, snakePageName, pascalPageName, hasData);
      Logger.success('Removed from dependency injection');
    }

    Logger.header('Page Removed Successfully! 🗑️');

    print('');
    print('$_green✨ What was removed:$_reset');
    print('   • Page: ${snakePageName}_page.dart');
    if (hasBloc) {
      print('   • BLoC: ${snakePageName}_bloc.dart');
      print('   • Events: ${snakePageName}_event.dart');
      print('   • States: ${snakePageName}_state.dart');
    }
    if (hasData) {
      print('   • Entity: ${snakePageName}_entity.dart');
      print('   • Repository: ${snakePageName}_repository.dart');
      print('   • Use Case: get_${snakePageName}_usecase.dart');
      print('   • Model: ${snakePageName}_model.dart');
      print('   • DataSource: ${snakePageName}_remote_datasource.dart');
      print(
          '   • Repository Implementation: ${snakePageName}_repository_impl.dart');
    }
    print('');
    print('$_green✨ What was cleaned up automatically:$_reset');
    print('   • Route removed from app_routes.dart');
    print('   • Route removed from app_router.dart');
    if (hasBloc) {
      print('   • Dependencies removed from injection_container.dart');
    }
    print('');
  } catch (e) {
    Logger.error('Error removing page: $e');
    exit(1);
  }
}