import 'package:flutter/material.dart';
import 'package:em2rp/models/equipment_model.dart';
import 'package:em2rp/models/event_model.dart';
import 'package:em2rp/utils/colors.dart';

/// Type d'étape pour le checklist
enum ChecklistStep {
  preparation,
  loading,
  unloading,
  return_,
}

/// Widget pour afficher un équipement dans une checklist de préparation/retour
class EquipmentChecklistItem extends StatefulWidget {
  final EquipmentModel equipment;
  final EventEquipment eventEquipment;
  final ChecklistStep step;
  final bool isValidated; // État de validation (passé depuis le parent)
  final VoidCallback onToggle;
  final ValueChanged<int>? onQuantityChanged; // Callback pour changer la quantité à cette étape
  final bool isChild; // Indique si c'est un enfant de container (affichage indenté et plus petit)
  final bool wasMissingBefore; // Était manquant à l'étape précédente

  const EquipmentChecklistItem({
    super.key,
    required this.equipment,
    required this.eventEquipment,
    this.step = ChecklistStep.preparation,
    required this.isValidated,
    required this.onToggle,
    this.onQuantityChanged,
    this.isChild = false, // Par défaut, pas d'indentation
    this.wasMissingBefore = false,
  });

  @override
  State<EquipmentChecklistItem> createState() => _EquipmentChecklistItemState();
}

class _EquipmentChecklistItemState extends State<EquipmentChecklistItem> {
  late TextEditingController _quantityController;

  int _getCurrentQuantity() {
    switch (widget.step) {
      case ChecklistStep.preparation:
        return widget.eventEquipment.quantityAtPreparation ?? widget.eventEquipment.quantity;
      case ChecklistStep.loading:
        return widget.eventEquipment.quantityAtLoading ?? widget.eventEquipment.quantityAtPreparation ?? widget.eventEquipment.quantity;
      case ChecklistStep.unloading:
        return widget.eventEquipment.quantityAtUnloading ?? widget.eventEquipment.quantityAtLoading ?? widget.eventEquipment.quantityAtPreparation ?? widget.eventEquipment.quantity;
      case ChecklistStep.return_:
        return widget.eventEquipment.quantityAtReturn ?? widget.eventEquipment.quantityAtUnloading ?? widget.eventEquipment.quantityAtLoading ?? widget.eventEquipment.quantityAtPreparation ?? widget.eventEquipment.quantity;
    }
  }

  @override
  void initState() {
    super.initState();
    _quantityController = TextEditingController(text: _getCurrentQuantity().toString());
  }

  @override
  void didUpdateWidget(covariant EquipmentChecklistItem oldWidget) {
    super.didUpdateWidget(oldWidget);
    final currentQty = _getCurrentQuantity();
    final controllerQty = int.tryParse(_quantityController.text);
    if (controllerQty != currentQty) {
      _quantityController.text = currentQty.toString();
    }
  }

  @override
  void dispose() {
    _quantityController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final hasQuantity = widget.equipment.hasQuantity;

    // Déterminer la quantité actuelle selon l'étape
    final int currentQuantity = _getCurrentQuantity();

    return Padding(
      padding: EdgeInsets.only(
        left: widget.isChild ? 32.0 : 0.0, // Indentation pour les enfants
        top: 4.0,
        bottom: 4.0,
      ),
      child: Card(
        margin: EdgeInsets.zero,
        elevation: widget.isChild ? 0 : 1, // Pas d'élévation pour les enfants
        color: widget.wasMissingBefore
            ? Colors.orange.shade50
            : (widget.isChild ? Colors.grey.shade50 : Colors.white),
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(8),
          side: BorderSide(
            color: widget.wasMissingBefore
                ? Colors.orange
                : (widget.isValidated ? Colors.green : Colors.grey.shade300),
            width: (widget.isValidated || widget.wasMissingBefore) ? 2 : 1,
          ),
        ),
        child: ListTile(
          dense: widget.isChild, // Plus compact pour les enfants
          contentPadding: EdgeInsets.symmetric(
            horizontal: widget.isChild ? 8.0 : 16.0,
            vertical: widget.isChild ? 4.0 : 8.0,
          ),
          leading: Container(
            width: widget.isChild ? 32 : 40,
            height: widget.isChild ? 32 : 40,
            decoration: BoxDecoration(
              color: widget.wasMissingBefore
                  ? Colors.orange.shade100
                  : (widget.isValidated ? Colors.green.shade100 : Colors.grey.shade100),
              borderRadius: BorderRadius.circular(8),
            ),
            child: IconButton(
              icon: Icon(
                widget.wasMissingBefore
                    ? Icons.warning
                    : (widget.isValidated ? Icons.check_circle : Icons.radio_button_unchecked),
                color: widget.wasMissingBefore
                    ? Colors.orange
                    : (widget.isValidated ? Colors.green : Colors.grey),
                size: widget.isChild ? 18 : 24,
              ),
              onPressed: widget.onToggle,
              padding: EdgeInsets.zero,
            ),
          ),
          title: Text(
            widget.equipment.name,
            style: TextStyle(
              fontWeight: widget.isChild ? FontWeight.w500 : FontWeight.w600,
              fontSize: widget.isChild ? 13 : 15,
              decoration: widget.isValidated ? TextDecoration.lineThrough : null,
              color: widget.isValidated ? Colors.grey : null,
            ),
          ),
          subtitle: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              if (widget.equipment.model != null)
                Text(
                  widget.equipment.model!,
                  style: TextStyle(
                    fontSize: 12,
                    color: Colors.grey.shade600,
                  ),
                ),

              // Indicateur si manquant à l'étape précédente
              if (widget.wasMissingBefore)
                Padding(
                  padding: const EdgeInsets.only(top: 4.0),
                  child: Row(
                    children: [
                      const Icon(Icons.warning_amber, size: 14, color: Colors.orange),
                      const SizedBox(width: 4),
                      Text(
                        'Était manquant à l\'étape précédente',
                        style: TextStyle(
                          fontSize: 11,
                          color: Colors.orange.shade700,
                          fontWeight: FontWeight.w600,
                        ),
                      ),
                    ],
                  ),
                ),

              // Quantité (éditable ou affichage seul)
              if (hasQuantity) ...[
                const SizedBox(height: 6),
                Row(
                  children: [
                    const Text(
                      'Quantité : ',
                      style: TextStyle(
                        fontSize: 12,
                        fontWeight: FontWeight.w500,
                        color: AppColors.bleuFonce,
                      ),
                    ),
                    if (widget.onQuantityChanged != null)
                      SizedBox(
                        width: 60,
                        child: TextFormField(
                          controller: _quantityController,
                          keyboardType: TextInputType.number,
                          style: const TextStyle(fontSize: 12),
                          decoration: InputDecoration(
                            isDense: true,
                            contentPadding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4),
                            border: OutlineInputBorder(
                              borderRadius: BorderRadius.circular(4),
                            ),
                          ),
                          onChanged: (value) {
                            final qty = int.tryParse(value) ?? currentQuantity;
                            widget.onQuantityChanged!(qty);
                          },
                        ),
                      )
                    else
                      Text(
                        currentQuantity.toString(),
                        style: const TextStyle(
                          fontSize: 12,
                          fontWeight: FontWeight.w600,
                          color: AppColors.bleuFonce,
                        ),
                      ),
                  ],
                ),
              ],
            ],
          ),
          trailing: widget.isValidated
            ? Container(
                padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
                decoration: BoxDecoration(
                  color: Colors.green.shade100,
                  borderRadius: BorderRadius.circular(12),
                ),
                child: const Row(
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    Icon(Icons.check, size: 16, color: Colors.green),
                    SizedBox(width: 4),
                    Text(
                      'Validé',
                      style: TextStyle(
                        color: Colors.green,
                        fontSize: 12,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ],
                ),
              )
            : null,
        ), // Fin ListTile
      ), // Fin Card
    ); // Fin Padding
  }
}

