import { Head } from '@inertiajs/react';
import { AlertTriangle } from 'lucide-react';
import {
    Download,
    FoldVertical,
    ImageDown,
    Maximize2,
    Network,
    UnfoldVertical,
    ZoomIn,
    ZoomOut,
} from 'lucide-react';
import { useRef } from 'react';
import Heading from '@/components/heading';
import { Button } from '@/components/ui/button';
import { dashboard } from '@/routes';
import { index, pdf } from '@/routes/admin/organization-chart';
import {
    OrganizationChartCanvas,
} from './organization-chart-canvas';
import type {
    ChartNode,
    OrganizationChartCanvasHandle,
} from './organization-chart-canvas';

type Stats = {
    total: number;
    roots: number;
    synthetic: number;
    orphans: number;
};

export default function OrganizationChartIndex({
    nodes,
    stats,
}: {
    nodes: ChartNode[];
    tree: unknown;
    stats: Stats;
}) {
    const canvasRef = useRef<OrganizationChartCanvasHandle>(null);

    return (
        <>
            <Head title="Organigramme" />
            <div className="flex h-full flex-1 flex-col gap-4 p-4 md:p-6">
                <div className="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
                    <Heading
                        title="Organigramme"
                        description={`${stats.total} nœud${stats.total > 1 ? 's' : ''} · ${stats.roots} racine${stats.roots > 1 ? 's' : ''}`}
                    />
                    <div className="flex flex-wrap gap-2">
                        <Button
                            type="button"
                            variant="outline"
                            size="sm"
                            onClick={() => canvasRef.current?.zoomOut()}
                        >
                            <ZoomOut />
                            Zoom −
                        </Button>
                        <Button
                            type="button"
                            variant="outline"
                            size="sm"
                            onClick={() => canvasRef.current?.zoomIn()}
                        >
                            <ZoomIn />
                            Zoom +
                        </Button>
                        <Button
                            type="button"
                            variant="outline"
                            size="sm"
                            onClick={() => canvasRef.current?.fitView()}
                        >
                            <Maximize2 />
                            Ajuster
                        </Button>
                        <Button
                            type="button"
                            variant="outline"
                            size="sm"
                            onClick={() => canvasRef.current?.expandAll()}
                        >
                            <UnfoldVertical />
                            Tout déplier
                        </Button>
                        <Button
                            type="button"
                            variant="outline"
                            size="sm"
                            onClick={() => canvasRef.current?.collapseAll()}
                        >
                            <FoldVertical />
                            Tout replier
                        </Button>
                        <Button
                            type="button"
                            variant="outline"
                            size="sm"
                            onClick={() => void canvasRef.current?.exportPng()}
                        >
                            <ImageDown />
                            PNG
                        </Button>
                        <Button variant="outline" size="sm" asChild>
                            <a
                                href={pdf.url()}
                                target="_blank"
                                rel="noopener noreferrer"
                            >
                                <Download />
                                PDF
                            </a>
                        </Button>
                    </div>
                </div>

                {(stats.synthetic > 0 || stats.orphans > 1) && (
                    <div className="space-y-2">
                        {stats.synthetic > 0 && (
                            <div className="flex gap-3 rounded-lg border border-amber-500/40 bg-amber-500/10 px-4 py-3 text-sm">
                                <AlertTriangle className="mt-0.5 size-4 shrink-0 text-amber-700 dark:text-amber-400" />
                                <p>
                                    {stats.synthetic} manager
                                    {stats.synthetic > 1 ? 's' : ''} sans fiche
                                    collaborateur. Créez leur fiche ou rattachez
                                    les collaborateurs à un manager existant.
                                </p>
                            </div>
                        )}
                        {stats.orphans > 1 && (
                            <div className="flex gap-3 rounded-lg border border-amber-500/40 bg-amber-500/10 px-4 py-3 text-sm">
                                <AlertTriangle className="mt-0.5 size-4 shrink-0 text-amber-700 dark:text-amber-400" />
                                <p>
                                    {stats.orphans} collaborateurs actifs sans
                                    manager (plusieurs racines). Vérifiez les
                                    rattachements hiérarchiques — une seule
                                    direction générale est attendue.
                                </p>
                            </div>
                        )}
                    </div>
                )}

                <div className="relative min-h-[560px] flex-1 overflow-hidden rounded-xl border bg-background">
                    {nodes.length === 0 ? (
                        <div className="flex h-full min-h-[560px] flex-col items-center justify-center gap-3 p-8 text-center">
                            <Network className="size-10 text-muted-foreground" />
                            <div>
                                <p className="font-medium">
                                    Aucun collaborateur actif
                                </p>
                                <p className="mt-1 text-sm text-muted-foreground">
                                    L’organigramme se construit automatiquement
                                    à partir des rattachements hiérarchiques.
                                </p>
                            </div>
                        </div>
                    ) : (
                        <OrganizationChartCanvas
                            nodes={nodes}
                            canvasRef={canvasRef}
                        />
                    )}
                </div>
            </div>
        </>
    );
}

OrganizationChartIndex.layout = {
    breadcrumbs: [
        { title: 'Tableau de bord', href: dashboard() },
        { title: 'Organigramme', href: index() },
    ],
};
