import 'package:platform_container/container.dart';
import 'package:platform_support/src/fluent.dart';

/// A mixin that provides localization functionality.
///
/// This mixin allows classes to execute code with a specific locale while ensuring
/// the original locale is restored afterward, similar to Laravel's Localizable trait.
mixin Localizable {
  /// Run the callback with the given locale.
  ///
  /// This method temporarily changes the application's locale, executes the callback,
  /// and then restores the original locale. This ensures that the locale change is
  /// localized to just the callback execution.
  ///
  /// If no locale is provided (null), the callback is executed with the current locale.
  ///
  /// Parameters:
  ///   - [locale]: The locale to use during callback execution
  ///   - [callback]: The function to execute with the specified locale
  ///
  /// Returns:
  ///   The result of executing the callback
  ///
  /// Example:
  /// ```dart
  /// withLocale('es', () {
  ///   // Code here runs with Spanish locale
  ///   return someValue;
  /// });
  /// ```
  T withLocale<T>(String? locale, T Function() callback) {
    if (locale == null) {
      return callback();
    }

    // Get the current locale
    final config = container.make<Fluent>();
    final original = config['locale'] as String;

    try {
      // Set the new locale
      config['locale'] = locale;
      return callback();
    } finally {
      // Restore the original locale
      config['locale'] = original;
    }
  }

  /// Get the container instance.
  ///
  /// This is a helper method to access the container. In a real application,
  /// you would typically get this from your application's service container.
  Container get container => throw UnimplementedError(
      'You must implement the container getter to use Localizable');
}