import 'package:flutter/material.dart';
import 'package:p_tits_pas/models/enfant_admin_model.dart';
import 'package:p_tits_pas/services/user_service.dart';
import 'package:p_tits_pas/utils/enfant_status_utils.dart';
import 'package:p_tits_pas/widgets/admin/common/admin_enfant_user_card.dart';
import 'package:p_tits_pas/widgets/admin/common/admin_select_list_modal.dart';

/// Sélection d'un enfant à rattacher (fiche AM / fiche parent) — ticket #146.
/// S'appuie sur [AdminSelectListModal] (shell partagé avec #147).
class AdminSelectEnfantModal {
  AdminSelectEnfantModal._();

  static Future<EnfantAdminModel?> show(
    BuildContext context, {
    Set<String> excludeIds = const {},
    String title = 'Rattacher un enfant',
    /// Affiché uniquement depuis la fiche AM : filtre les enfants déjà en garde.
    bool showSansGardeFilter = false,
  }) {
    return AdminSelectListModal.show<EnfantAdminModel>(
      context,
      title: title,
      searchHint: 'Rechercher par nom ou prénom…',
      emptyMessage: 'Aucun enfant disponible à rattacher',
      noResultsMessage: showSansGardeFilter
          ? 'Aucun enfant sans garde pour cette recherche'
          : 'Aucun résultat pour cette recherche',
      toggleFilter: showSansGardeFilter
          ? AdminSelectToggleFilter<EnfantAdminModel>(
              label: 'Sans garde',
              initialValue: true,
              whenEnabled: (e) =>
                  normalizeEnfantStatus(e.status) == 'sans_garde',
            )
          : null,
      loadItems: () async {
        final list = await UserService.getEnfants();
        return list
            .where((e) => !excludeIds.contains(e.id))
            .toList()
          ..sort(
            (a, b) =>
                a.fullName.toLowerCase().compareTo(b.fullName.toLowerCase()),
          );
      },
      matchesQuery: (e, q) {
        final name = e.fullName.toLowerCase();
        final fn = (e.firstName ?? '').toLowerCase();
        final ln = (e.lastName ?? '').toLowerCase();
        return name.contains(q) || fn.contains(q) || ln.contains(q);
      },
      itemBuilder: (context, e, onSelect) {
        return AdminEnfantUserCard.fromEnfant(
          e,
          onCardTap: onSelect,
          margin: const EdgeInsets.only(bottom: 4),
          contentPadding: const EdgeInsets.symmetric(
            horizontal: 10,
            vertical: 5,
          ),
          actions: [
            IconButton(
              icon: const Icon(Icons.add_link),
              tooltip: 'Rattacher',
              onPressed: onSelect,
            ),
          ],
        );
      },
    );
  }
}
