import 'package:flutter/material.dart';

/// Mode d'affichage d'un formulaire
enum DisplayMode {
  /// Mode éditable (formulaire d'inscription)
  editable,
  
  /// Mode lecture seule (récapitulatif)
  readonly,
}

/// Configuration d'affichage pour les widgets de formulaire
class DisplayConfig {
  /// Mode d'affichage (editable/readonly)
  final DisplayMode mode;
  
  /// Type de layout détecté (mobile/desktop)
  final LayoutType layoutType;

  const DisplayConfig({
    required this.mode,
    required this.layoutType,
  });

  /// Crée une config à partir du contexte
  factory DisplayConfig.fromContext(
    BuildContext context, {
    DisplayMode mode = DisplayMode.editable,
  }) {
    return DisplayConfig(
      mode: mode,
      layoutType: LayoutHelper.getLayoutType(context),
    );
  }

  /// Est en mode éditable
  bool get isEditable => mode == DisplayMode.editable;
  
  /// Est en mode lecture seule
  bool get isReadonly => mode == DisplayMode.readonly;
  
  /// Est en layout mobile
  bool get isMobile => layoutType == LayoutType.mobile;
  
  /// Est en layout desktop
  bool get isDesktop => layoutType == LayoutType.desktop;
  
  /// Layout vertical (mobile)
  bool get isVerticalLayout => isMobile;
  
  /// Layout horizontal (desktop)
  bool get isHorizontalLayout => isDesktop;
}

/// Type de layout
enum LayoutType {
  /// Mobile (< 600px) - toujours vertical
  mobile,
  
  /// Desktop/Tablette (≥ 600px) - horizontal
  desktop,
}

/// Utilitaires pour la détection de layout
class LayoutHelper {
  /// Seuil de largeur pour mobile/desktop (en pixels)
  static const double mobileBreakpoint = 600.0;

  /// Détermine le type de layout selon la largeur d'écran
  static LayoutType getLayoutType(BuildContext context) {
    final width = MediaQuery.of(context).size.width;
    return width < mobileBreakpoint 
      ? LayoutType.mobile 
      : LayoutType.desktop;
  }

  /// Vérifie si on est sur mobile
  static bool isMobile(BuildContext context) {
    return getLayoutType(context) == LayoutType.mobile;
  }

  /// Vérifie si on est sur desktop
  static bool isDesktop(BuildContext context) {
    return getLayoutType(context) == LayoutType.desktop;
  }

  /// Retourne un espacement adapté au layout
  static double getSpacing(BuildContext context, {
    double mobileSpacing = 12.0,
    double desktopSpacing = 20.0,
  }) {
    return isMobile(context) ? mobileSpacing : desktopSpacing;
  }

  /// Retourne une largeur max adaptée au layout
  static double getMaxWidth(BuildContext context, {
    double? mobileMaxWidth,
    double? desktopMaxWidth,
  }) {
    if (isMobile(context)) {
      return mobileMaxWidth ?? double.infinity;
    } else {
      return desktopMaxWidth ?? 1200.0;
    }
  }
}
