"use client";

import { useEffect, useMemo, useState } from "react";
import { useRouter } from "next/navigation";
import PageHeader from "@/components/admin/ui/PageHeader";
import Button from "@/components/admin/ui/Button";
import DataTable, { type Column } from "@/components/admin/ui/DataTable";
import StatusBadge from "@/components/admin/ui/StatusBadge";
import ConfirmDialog from "@/components/admin/ui/ConfirmDialog";
import { getAdminPartenaires, deleteAdminPartenaire } from "@/lib/api/admin/contenu";
import type { AdminPartenaire } from "@/types/admin";
import { Plus, Pencil, Trash2, Landmark, HeartHandshake, Building2, School } from "lucide-react";

const TYPE_INFOS: Record<string, { label: string; Icone: typeof Landmark }> = {
  GOUVERNEMENT: { label: "Gouvernement", Icone: Landmark },
  ONG: { label: "ONG", Icone: HeartHandshake },
  ENTREPRISE: { label: "Entreprise", Icone: Building2 },
  INSTITUTION: { label: "Institution", Icone: School },
};

export default function AdminPartenairesPage() {
  const router = useRouter();
  const [partenaires, setPartenaires] = useState<AdminPartenaire[]>([]);
  const [chargement, setChargement] = useState(true);
  const [aSupprimer, setASupprimer] = useState<AdminPartenaire | null>(null);

  const charger = () => {
    setChargement(true);
    getAdminPartenaires().then(setPartenaires).finally(() => setChargement(false));
  };

  useEffect(() => {
    charger();
  }, []);

  const confirmerSuppression = async () => {
    if (!aSupprimer) return;
    try {
      await deleteAdminPartenaire(aSupprimer.id);
      setASupprimer(null);
      charger();
    } catch {}
  };

  const colonnes: Column<AdminPartenaire>[] = useMemo(
    () => [
      { key: "nom", label: "Nom du partenaire", sortable: true },
      {
        key: "type",
        label: "Type",
        render: (p) => {
          const infos = TYPE_INFOS[p.type];
          return (
            <span style={{ display: "flex", alignItems: "center", gap: "6px" }}>
              {infos ? (
                <>
                  <infos.Icone size={14} color="var(--vert-fonce)" />
                  {infos.label}
                </>
              ) : (
                p.type
              )}
            </span>
          );
        },
      },
      { key: "siteWeb", label: "Site Web", render: (p) => (p.siteWeb ? <a href={p.siteWeb} target="_blank" rel="noreferrer" style={{ textDecoration: "underline" }}>{p.siteWeb}</a> : "—") },
      { key: "actif", label: "Statut", render: (p) => <StatusBadge status={p.actif ? "ACTIF" : "INACTIF"} /> },
      {
        key: "actions" as any,
        label: "Actions",
        align: "right",
        render: (p) => (
          <div style={{ display: "flex", gap: "8px", justifyContent: "flex-end" }}>
            <Button size="sm" variant="secondaire" onClick={() => router.push(`/admin/contenu/partenaires/${p.id}`)}>
              <Pencil size={14} />
            </Button>
            <Button size="sm" variant="danger" onClick={() => setASupprimer(p)}>
              <Trash2 size={14} />
            </Button>
          </div>
        ),
      },
    ],
    [router],
  );

  return (
    <div>
      <PageHeader
        title="Partenaires"
        subtitle="Gérez les partenaires gouvernementaux, ONG, entreprises et institutions affichés sur le site public."
        actions={
          <Button onClick={() => router.push("/admin/contenu/partenaires/nouveau")}>
            <Plus size={16} /> Nouveau partenaire
          </Button>
        }
      />

      <DataTable<AdminPartenaire>
        columns={colonnes}
        data={partenaires}
        isLoading={chargement}
        keyExtractor={(p) => p.id}
        emptyTitle="Aucun partenaire enregistré"
      />

      <ConfirmDialog
        open={aSupprimer !== null}
        title="Supprimer ce partenaire ?"
        description="Cette action est irréversible et retirera immédiatement le partenaire du site public."
        confirmLabel="Supprimer"
        danger
        onConfirm={confirmerSuppression}
        onCancel={() => setASupprimer(null)}
      />
    </div>
  );
}
