/// UnionFlow Primary Button - Bouton principal
/// 
/// Bouton primaire avec la couleur Bleu Roi (#4169E1)
/// Utilisé pour les actions principales (connexion, enregistrer, valider, etc.)
library uf_primary_button;

import 'package:flutter/material.dart';
import '../../tokens/color_tokens.dart';
import '../../tokens/spacing_tokens.dart';
import '../../tokens/typography_tokens.dart';

/// Bouton primaire UnionFlow
/// 
/// Usage:
/// ```dart
/// UFPrimaryButton(
///   label: 'Connexion',
///   onPressed: () => login(),
///   icon: Icons.login,
///   isLoading: false,
/// )
/// ```
class UFPrimaryButton extends StatelessWidget {
  /// Texte du bouton
  final String label;
  
  /// Callback appelé lors du clic
  final VoidCallback? onPressed;
  
  /// Indique si le bouton est en chargement
  final bool isLoading;
  
  /// Icône optionnelle à gauche du texte
  final IconData? icon;
  
  /// Bouton pleine largeur
  final bool isFullWidth;
  
  /// Hauteur personnalisée (optionnel)
  final double? height;

  const UFPrimaryButton({
    super.key,
    required this.label,
    this.onPressed,
    this.isLoading = false,
    this.icon,
    this.isFullWidth = false,
    this.height,
  });

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      width: isFullWidth ? double.infinity : null,
      height: height ?? SpacingTokens.buttonHeightLarge,
      child: ElevatedButton(
        onPressed: isLoading ? null : onPressed,
        style: ElevatedButton.styleFrom(
          backgroundColor: ColorTokens.primary, // Bleu roi
          foregroundColor: ColorTokens.onPrimary, // Blanc
          disabledBackgroundColor: ColorTokens.primary.withOpacity(0.5),
          disabledForegroundColor: ColorTokens.onPrimary.withOpacity(0.7),
          elevation: SpacingTokens.elevationSm,
          shadowColor: ColorTokens.shadow,
          padding: const EdgeInsets.symmetric(
            horizontal: SpacingTokens.buttonPaddingHorizontal,
            vertical: SpacingTokens.buttonPaddingVertical,
          ),
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(SpacingTokens.radiusLg),
          ),
        ),
        child: isLoading
            ? const SizedBox(
                height: 20,
                width: 20,
                child: CircularProgressIndicator(
                  strokeWidth: 2,
                  valueColor: AlwaysStoppedAnimation<Color>(
                    ColorTokens.onPrimary,
                  ),
                ),
              )
            : Row(
                mainAxisSize: MainAxisSize.min,
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  if (icon != null) ...[
                    Icon(icon, size: 20),
                    const SizedBox(width: SpacingTokens.md),
                  ],
                  Text(
                    label,
                    style: TypographyTokens.buttonLarge,
                  ),
                ],
              ),
      ),
    );
  }
}

