'use client';

import { useState } from 'react';
import { Edit, Loader2, MoreHorizontal, UserCheck, UserX } from 'lucide-react';

import {
  extractApiErrorMessage,
  updateUtilisateur,
  type AuthUser,
  type Utilisateur,
} from '@/lib/api';
import { Button } from '@/components/ui/button';
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { useToast } from '@/hooks/use-toast';
import { nomComplet } from '@/lib/utilisateurs';

import { EditUtilisateurDialog } from './edit-utilisateur-dialog';

type UtilisateurActionsProps = {
  utilisateur: Utilisateur;
  currentUser: AuthUser | null;
  onUtilisateurUpdated: (utilisateur: Utilisateur) => void;
};

export function UtilisateurActions({
  utilisateur,
  currentUser,
  onUtilisateurUpdated,
}: UtilisateurActionsProps) {
  const [editDialogOpen, setEditDialogOpen] = useState(false);
  const [isUpdating, setIsUpdating] = useState(false);
  const { toast } = useToast();

  // §5.7.3 : vérifier que l'administrateur peut administrer cet utilisateur
  const canManage =
    currentUser !== null &&
    ((currentUser.role_ccfn === 'UTI-G' &&
      utilisateur.role_ccfn === 'UTI-F') ||
      (currentUser.role_ccfn === 'UTI-F' &&
        utilisateur.role_ccfn === 'UTI-S'));

  if (!canManage) {
    return (
      <span className="text-sm text-muted-foreground" title="Hors de votre périmètre d’administration">
        —
      </span>
    );
  }

  async function handleToggleActif() {
    try {
      setIsUpdating(true);

      const updated = await updateUtilisateur(utilisateur.id, {
        actif: !utilisateur.actif,
      });

      onUtilisateurUpdated(updated);

      toast({
        title: updated.actif ? 'Utilisateur réactivé' : 'Utilisateur désactivé',
        description: `${nomComplet(updated)} a été ${updated.actif ? 'réactivé' : 'désactivé'} avec succès.`,
      });
    } catch (err) {
      console.error('Erreur lors de la modification de l\'utilisateur:', err);
      toast({
        variant: 'destructive',
        title: 'Erreur',
        description: extractApiErrorMessage(
          err,
          'Impossible de modifier l\'utilisateur. Vérifiez vos autorisations.',
        ),
      });
    } finally {
      setIsUpdating(false);
    }
  }

  return (
    <>
      <DropdownMenu>
        <DropdownMenuTrigger asChild>
          <Button variant="ghost" size="icon" disabled={isUpdating}>
            {isUpdating ? (
              <Loader2 className="h-4 w-4 animate-spin" />
            ) : (
              <MoreHorizontal className="h-4 w-4" />
            )}
            <span className="sr-only">
              Actions sur {nomComplet(utilisateur)}
            </span>
          </Button>
        </DropdownMenuTrigger>

        <DropdownMenuContent align="end">
          <DropdownMenuLabel className="text-xs font-normal text-muted-foreground">
            {nomComplet(utilisateur)}
          </DropdownMenuLabel>
          <DropdownMenuSeparator />

          <DropdownMenuItem onSelect={() => setEditDialogOpen(true)}>
            <Edit className="h-4 w-4" />
            Modifier
          </DropdownMenuItem>

          {/* §5.7.1 et §5.7.2 : la désactivation et la réactivation relèvent de l'administrateur de l'UTI. */}
          <DropdownMenuItem
            onSelect={() => void handleToggleActif()}
            className={
              utilisateur.actif ? 'text-destructive focus:text-destructive' : ''
            }
          >
            {utilisateur.actif ? (
              <UserX className="h-4 w-4" />
            ) : (
              <UserCheck className="h-4 w-4" />
            )}
            {utilisateur.actif ? 'Désactiver le compte' : 'Réactiver le compte'}
          </DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>

      <EditUtilisateurDialog
        key={utilisateur.updated_at}
        open={editDialogOpen}
        onOpenChange={setEditDialogOpen}
        utilisateur={utilisateur}
        onUtilisateurUpdated={onUtilisateurUpdated}
      />
    </>
  );
}
