generateCloneConfigFile function

Future<void> generateCloneConfigFile(
  1. CloneConfigModel configModel
)

Generates the clone_configs.dart file based on the provided configModel.

This function creates or updates lib/generated/clone_configs.dart, which contains static constants for various configuration parameters such as colors, gradients, base URL, client ID, version, primary color, and custom fields. This file allows Flutter applications to access clone-specific configurations at compile time.

configModel The CloneConfigModel containing the configuration data to be written to the generated file.

Throws a FileSystemException if the 'generated' directory cannot be created or the 'clone_configs.dart' file cannot be written.

Implementation

Future<void> generateCloneConfigFile(CloneConfigModel configModel) async {
  // 1. Check if the 'generated' directory exists
  final generatedDir = Directory('./lib/generated');
  if (!generatedDir.existsSync()) {
    generatedDir.createSync(recursive: true);
    logger.i('Created "lib/generated" directory.');
  }

  // 2. Create 'clone_configs.dart' file
  final file = File('${generatedDir.path}/clone_configs.dart');
  final sink = file.openWrite();

  // 3. Write 'CloneConfigs' class
  sink.writeln(
    '// Auto-generated file. any changes will be overwritten. edit clone config instead.',
  );
  // sink.writeln("import 'package:flutter/material.dart';\n");
  sink.writeln('abstract class CloneConfigs {');

  // 3.1. Write colors
  for (var i = 0; i < (configModel.colors?.length ?? 0); i++) {
    final color = configModel.colors![i];
    sink.writeln('  static const ${color.name} = Color(0xFF${color.color});');
  }

  sink.writeln('  static const String baseUrl = "${configModel.baseUrl}";');
  sink.writeln(
    '  static const String packageName = "${configModel.packageName}";',
  );
  sink.writeln('  static const String appName = "${configModel.appName}";');
  sink.writeln(
    '  static const String logo = "assets/images/${configModel.logo}";',
  );
  sink.writeln(
    '  static const String launcherIcon = "assets/images/${configModel.launcherIcon}";',
  );
  sink.writeln(
    '  static const String splashScreen = "assets/images/${configModel.splashScreen}";',
  );
  sink.writeln(
    '  static const String firebaseProjectId = "${configModel.firebaseProjectId}";',
  );
  sink.writeln('  static const String clientId = "${configModel.clientId}";');
  sink.writeln('  static const String version = "${configModel.version}";');
  sink.writeln(
    '  static const String primaryColor = "${configModel.primaryColor}";',
  );

  // 3.8 Write Custom Fields (if any exist in clonifySettings)
  if (clonifySettings.customFields.isNotEmpty) {
    // Read the config file to get custom field values
    final configPath = './clonify/clones/${configModel.clientId}/config.json';
    final configFile = File(configPath);
    if (configFile.existsSync()) {
      final configJson =
          jsonDecode(configFile.readAsStringSync()) as Map<String, dynamic>;

      for (final field in clonifySettings.customFields) {
        final value = configJson[field.name];
        if (value != null) {
          // Generate the constant based on type
          switch (field.type) {
            case 'int':
              sink.writeln('  static const int ${field.name} = $value;');
              break;
            case 'double':
              sink.writeln('  static const double ${field.name} = $value;');
              break;
            case 'bool':
              sink.writeln('  static const bool ${field.name} = $value;');
              break;
            case 'string':
            default:
              sink.writeln('  static const String ${field.name} = "$value";');
              break;
          }
        }
      }
    }
  }

  // 4. Access the _assetTargetDirectory and for each file in that directory add its path
  // final assetsDirectory =
  //     Directory('./clonify/clones/${configModel.clientId}/assets');

  // if (assetsDirectory.existsSync()) {
  //   final assetFiles = assetsDirectory.listSync();
  //   for (final asset in assetFiles) {
  //     if (asset is File) {
  //       final assetFileName = asset.path.split(Platform.pathSeparator).last;
  //       // final variableName = path.withoutExtension(assetFileName).replaceAll(
  //       //     RegExp(r'\W+'), '_'); // Sanitize file names to valid variable names
  //       final variableName = assetFileName
  //           .replaceAll(RegExp(r'\W+'), '_')
  //           .replaceAll(RegExp(r'^\d+'),
  //               ''); // Sanitize file names to valid variable names
  //       sink.writeln(
  //           '  static const String $variableName = "${asset.path}$assetFileName";');
  //     }
  //   }
  // }

  sink.writeln('}');

  // Close the file stream
  sink.close();

  logger.i(
    'Generated clone_configs.dart file. You can find it in lib/generated/clone_configs.dart',
  );
}