import 'package:flutter/material.dart';

/// Classe utilitaire pour gérer les couleurs de l'application en mode clair et sombre.
///
/// Cette classe fournit un système de couleurs cohérent et accessible
/// pour toute l'application, avec support complet du thème clair et sombre.
///
/// **Usage:**
/// ```dart
/// AppColors.primary // Retourne la couleur primaire selon le thème
/// AppColors.lightPrimary // Accès direct à la couleur claire
/// ```
class AppColors {
  // ============================================================================
  // THÈME CLAIR - Couleurs pour le mode clair
  // ============================================================================

  /// Couleur primaire du thème clair (Bleu Instagram-like)
  static const Color lightPrimary = Color(0xFF0095F6);

  /// Couleur secondaire du thème clair (Rose Instagram-like)
  static const Color lightSecondary = Color(0xFFE1306C);

  /// Couleur pour le texte/éléments sur la couleur primaire (Blanc)
  static const Color lightOnPrimary = Colors.white;

  /// Couleur pour le texte/éléments sur la couleur secondaire (Noir)
  static const Color lightOnSecondary = Color(0xFF212121);

  /// Couleur de fond principale (Blanc pur)
  static const Color lightBackground = Color(0xFFFAFAFA);

  /// Couleur de surface (Blanc)
  static const Color lightSurface = Color(0xFFFFFFFF);

  /// Couleur de texte primaire (Gris foncé)
  static const Color lightTextPrimary = Color(0xFF212121);

  /// Couleur de texte secondaire (Gris moyen)
  static const Color lightTextSecondary = Color(0xFF616161);

  /// Couleur des cartes (Blanc avec ombre douce)
  static const Color lightCardColor = Color(0xFFFFFFFF);

  /// Couleur d'accent (Vert)
  static const Color lightAccentColor = Color(0xFF4CAF50);

  /// Couleur d'erreur (Rouge foncé)
  static const Color lightError = Color(0xFFB00020);

  /// Couleur des icônes primaires (Gris foncé)
  static const Color lightIconPrimary = Color(0xFF212121);

  /// Couleur des icônes secondaires (Gris clair)
  static const Color lightIconSecondary = Color(0xFF757575);

  /// Couleur de fond personnalisée (Bleu clair)
  static const Color lightBackgroundCustom = Color(0xFFE0F7FA);

  // ============================================================================
  // THÈME SOMBRE - Couleurs pour le mode sombre
  // ============================================================================

  /// Couleur primaire du thème sombre (Noir)
  static const Color darkPrimary = Color(0xFF121212);

  /// Couleur secondaire du thème sombre (Orange)
  static const Color darkSecondary = Color(0xFFFF5722);

  /// Couleur pour le texte/éléments sur la couleur primaire (Blanc)
  static const Color darkOnPrimary = Colors.white;

  /// Couleur pour le texte/éléments sur la couleur secondaire (Blanc)
  static const Color darkOnSecondary = Colors.white;

  /// Couleur de fond principale (Noir)
  static const Color darkBackground = Color(0xFF121212);

  /// Couleur de surface (Gris très foncé)
  static const Color darkSurface = Color(0xFF1F1F1F);

  /// Couleur de texte primaire (Gris clair)
  static const Color darkTextPrimary = Color(0xFFE0E0E0);

  /// Couleur de texte secondaire (Gris moyen)
  static const Color darkTextSecondary = Color(0xFFBDBDBD);

  /// Couleur des cartes (Gris foncé)
  static const Color darkCardColor = Color(0xFF2C2C2C);

  /// Couleur d'accent (Vert clair)
  static const Color darkAccentColor = Color(0xFF81C784);

  /// Couleur d'erreur (Rouge clair)
  static const Color darkError = Color(0xFFF1012B);

  /// Couleur des icônes primaires (Blanc)
  static const Color darkIconPrimary = Colors.white;

  /// Couleur des icônes secondaires (Gris clair)
  static const Color darkIconSecondary = Color(0xFFBDBDBD);

  /// Couleur de fond personnalisée (Bleu foncé)
  static const Color darkBackgroundCustom = Color(0xFF2C2C3E);

  // ============================================================================
  // GETTERS DYNAMIQUES - Retournent la couleur selon le thème actif
  // ============================================================================

  /// Retourne la couleur primaire selon le thème actif
  static Color get primary => _isDarkMode() ? darkPrimary : lightPrimary;

  /// Retourne la couleur secondaire selon le thème actif
  static Color get secondary => _isDarkMode() ? darkSecondary : lightSecondary;

  /// Retourne la couleur pour le texte sur primaire selon le thème actif
  static Color get onPrimary => _isDarkMode() ? darkOnPrimary : lightOnPrimary;

  /// Retourne la couleur pour le texte sur secondaire selon le thème actif
  static Color get onSecondary => _isDarkMode() ? darkOnSecondary : lightOnSecondary;

  /// Retourne la couleur de fond selon le thème actif
  static Color get backgroundColor => _isDarkMode() ? darkBackground : lightBackground;

  /// Retourne la couleur de surface selon le thème actif
  static Color get surface => _isDarkMode() ? darkSurface : lightSurface;

  /// Retourne la couleur de texte primaire selon le thème actif
  static Color get textPrimary => _isDarkMode() ? darkTextPrimary : lightTextPrimary;

  /// Retourne la couleur de texte secondaire selon le thème actif
  static Color get textSecondary => _isDarkMode() ? darkTextSecondary : lightTextSecondary;

  /// Retourne la couleur des cartes selon le thème actif
  static Color get cardColor => _isDarkMode() ? darkCardColor : lightCardColor;

  /// Retourne la couleur d'accent selon le thème actif
  static Color get accentColor => _isDarkMode() ? darkAccentColor : lightAccentColor;

  /// Retourne la couleur d'erreur selon le thème actif
  static Color get errorColor => _isDarkMode() ? darkError : lightError;

  /// Retourne la couleur des icônes primaires selon le thème actif
  static Color get iconPrimary => _isDarkMode() ? darkIconPrimary : lightIconPrimary;

  /// Retourne la couleur des icônes secondaires selon le thème actif
  static Color get iconSecondary => _isDarkMode() ? darkIconSecondary : lightIconSecondary;

  /// Retourne la couleur de fond personnalisée selon le thème actif
  static Color get customBackgroundColor =>
      _isDarkMode() ? darkBackgroundCustom : lightBackgroundCustom;

  // ============================================================================
  // MÉTHODES UTILITAIRES
  // ============================================================================

  /// Vérifie si le mode sombre est activé selon les préférences système.
  ///
  /// **Note:** Cette méthode vérifie uniquement les préférences système.
  /// Pour vérifier le thème de l'application, utilisez [ThemeProvider].
  ///
  /// Returns `true` si le mode sombre est activé, `false` sinon.
  static bool _isDarkMode() {
    try {
      final brightness =
          WidgetsBinding.instance.platformDispatcher.platformBrightness;
      return brightness == Brightness.dark;
    } catch (e) {
      // En cas d'erreur, retourner false (mode clair par défaut)
      return false;
    }
  }

  /// Vérifie si le mode sombre est activé (méthode publique).
  ///
  /// Cette méthode est dépréciée. Utilisez [ThemeProvider] pour vérifier
  /// le thème de l'application.
  @Deprecated('Utilisez ThemeProvider.isDarkMode à la place')
  static bool isDarkMode() => _isDarkMode();

  /// Crée une couleur avec opacité.
  ///
  /// [color] La couleur de base
  /// [opacity] L'opacité entre 0.0 et 1.0
  ///
  /// Returns une nouvelle couleur avec l'opacité spécifiée.
  static Color withOpacity(Color color, double opacity) {
    return color.withOpacity(opacity.clamp(0.0, 1.0));
  }

  /// Crée un dégradé linéaire avec les couleurs primaire et secondaire.
  ///
  /// [isDark] Si true, utilise les couleurs du thème sombre
  ///
  /// Returns un [LinearGradient] avec les couleurs appropriées.
  static LinearGradient primaryGradient({bool isDark = false}) {
    return LinearGradient(
      begin: Alignment.topLeft,
      end: Alignment.bottomRight,
      colors: isDark
          ? [darkPrimary, darkSecondary]
          : [lightPrimary, lightSecondary],
    );
  }
}
