/// Widget de menu latéral (drawer) du dashboard
/// Navigation principale de l'application
library dashboard_drawer;

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

/// Modèle de données pour un élément de menu
class DrawerMenuItem {
  /// Icône de l'élément de menu
  final IconData icon;
  
  /// Titre de l'élément de menu
  final String title;
  
  /// Callback lors du tap sur l'élément
  final VoidCallback? onTap;

  /// Constructeur du modèle d'élément de menu
  const DrawerMenuItem({
    required this.icon,
    required this.title,
    this.onTap,
  });
}

/// Widget de menu latéral
/// 
/// Affiche la navigation principale avec :
/// - Header avec profil utilisateur
/// - Menu de navigation structuré
/// - Actions secondaires
/// - Design Material avec gradient
class DashboardDrawer extends StatelessWidget {
  /// Callback pour les actions de navigation
  final Function(String route)? onNavigate;
  
  /// Callback pour la déconnexion
  final VoidCallback? onLogout;

  /// Constructeur du menu latéral
  const DashboardDrawer({
    super.key,
    this.onNavigate,
    this.onLogout,
  });

  /// Génère la liste des éléments de menu principaux
  List<DrawerMenuItem> _getMainMenuItems() {
    return [
      DrawerMenuItem(
        icon: Icons.dashboard,
        title: 'Dashboard',
        onTap: () => onNavigate?.call('/dashboard'),
      ),
      DrawerMenuItem(
        icon: Icons.people,
        title: 'Membres',
        onTap: () => onNavigate?.call('/members'),
      ),
      DrawerMenuItem(
        icon: Icons.account_balance_wallet,
        title: 'Cotisations',
        onTap: () => onNavigate?.call('/cotisations'),
      ),
      DrawerMenuItem(
        icon: Icons.event,
        title: 'Événements',
        onTap: () => onNavigate?.call('/events'),
      ),
      DrawerMenuItem(
        icon: Icons.favorite,
        title: 'Solidarité',
        onTap: () => onNavigate?.call('/solidarity'),
      ),
    ];
  }

  /// Génère la liste des éléments de menu secondaires
  List<DrawerMenuItem> _getSecondaryMenuItems() {
    return [
      DrawerMenuItem(
        icon: Icons.analytics,
        title: 'Rapports',
        onTap: () => onNavigate?.call('/reports'),
      ),
      DrawerMenuItem(
        icon: Icons.settings,
        title: 'Paramètres',
        onTap: () => onNavigate?.call('/settings'),
      ),
      DrawerMenuItem(
        icon: Icons.help,
        title: 'Aide',
        onTap: () => onNavigate?.call('/help'),
      ),
    ];
  }

  @override
  Widget build(BuildContext context) {
    final mainItems = _getMainMenuItems();
    final secondaryItems = _getSecondaryMenuItems();
    
    return Drawer(
      child: ListView(
        padding: EdgeInsets.zero,
        children: [
          _buildDrawerHeader(),
          ...mainItems.map((item) => _buildMenuItem(item)),
          const Divider(),
          ...secondaryItems.map((item) => _buildMenuItem(item)),
          const Divider(),
          _buildLogoutItem(),
        ],
      ),
    );
  }

  /// Construit l'en-tête du drawer avec profil utilisateur
  Widget _buildDrawerHeader() {
    return DrawerHeader(
      decoration: const BoxDecoration(
        gradient: LinearGradient(
          colors: [ColorTokens.primary, ColorTokens.secondary],
          begin: Alignment.topLeft,
          end: Alignment.bottomRight,
        ),
      ),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          const CircleAvatar(
            radius: 30,
            backgroundColor: Colors.white,
            child: Icon(
              Icons.person,
              size: 35,
              color: ColorTokens.primary,
            ),
          ),
          const SizedBox(height: SpacingTokens.md),
          Text(
            'Utilisateur UnionFlow',
            style: TypographyTokens.titleMedium.copyWith(
              color: Colors.white,
              fontWeight: FontWeight.w600,
            ),
          ),
          Text(
            'admin@unionflow.dev',
            style: TypographyTokens.bodySmall.copyWith(
              color: Colors.white.withOpacity(0.8),
            ),
          ),
        ],
      ),
    );
  }

  /// Construit un élément de menu
  Widget _buildMenuItem(DrawerMenuItem item) {
    return ListTile(
      leading: Icon(item.icon),
      title: Text(
        item.title,
        style: TypographyTokens.bodyMedium,
      ),
      onTap: item.onTap,
    );
  }

  /// Construit l'élément de déconnexion
  Widget _buildLogoutItem() {
    return ListTile(
      leading: const Icon(
        Icons.logout,
        color: ColorTokens.error,
      ),
      title: Text(
        'Déconnexion',
        style: TypographyTokens.bodyMedium.copyWith(
          color: ColorTokens.error,
        ),
      ),
      onTap: onLogout,
    );
  }
}
