import { Head, Link, usePage } from '@inertiajs/react';
import { Separator } from '@/components/ui/separator';
import { cn } from '@/lib/utils';
import { index as divisionsIndex } from '@/routes/divisions';
import { show_tasks as divisionShow } from '@/routes/divisions';
import type { Auth } from '@/types';
import type { DivisionIndexItem } from '@/types/division';

interface DivisionsProps {
    divisions: DivisionIndexItem[];
}

export default function Divisions({ divisions }: DivisionsProps) {
    const { auth } = usePage<Auth>().props;
    const userId = auth.user.id;
    // Super admin membaca semua divisi read-only, jadi kartu divisi yang bukan
    // miliknya tetap bisa dibuka meski ia tak terdaftar sebagai anggota.
    const isSuperAdmin = auth.user.role === 'super_admin';

    const userDivisions = divisions.filter((division) =>
        division.members?.some((member) => member.user_id === userId),
    );

    const otherDivisions = divisions.filter(
        (division) =>
            !division.members?.some((member) => member.user_id === userId),
    );

    return (
        <>
            <Head title="Divisions" />
            <div className="flex h-full flex-1 flex-col gap-4 overflow-x-auto p-4 md:p-6">
                <div className="flex h-full w-fit flex-row gap-4 md:gap-6">
                    {userDivisions.map((division) => (
                        <DivisionCard
                            key={division.id}
                            division={division}
                            isUserDivision
                            clickable
                        />
                    ))}

                    {userDivisions.length > 0 && otherDivisions.length > 0 && (
                        <Separator
                            orientation="vertical"
                            className="my-4 h-auto"
                        />
                    )}

                    {otherDivisions.map((division) => (
                        <DivisionCard
                            key={division.id}
                            division={division}
                            clickable={isSuperAdmin}
                        />
                    ))}
                </div>
            </div>
        </>
    );
}

function DivisionCard({
    division,
    isUserDivision = false,
    clickable = false,
}: {
    division: DivisionIndexItem;
    isUserDivision?: boolean;
    clickable?: boolean;
}) {
    const CardContent = (
        <div className="flex h-full flex-col gap-4 bg-card p-5">
            <div className="h-[4em] space-y-1.5">
                <h3 className="font-mono text-xl font-bold tracking-tight text-foreground transition-colors group-hover:text-primary">
                    {division.name}
                </h3>
                <p className="line-clamp-2 text-sm leading-relaxed text-muted-foreground">
                    {division.description}
                </p>
            </div>

            <div className="block">
                <div className="flex items-center gap-3 py-1">
                    <Separator orientation="horizontal" className="flex-1" />
                    <p className="text-[10px] font-bold tracking-widest text-muted-foreground uppercase">
                        Members
                    </p>
                    <Separator orientation="horizontal" className="flex-1" />
                </div>

                <div className="custom-scrollbar flex min-h-[13em] flex-1 flex-col gap-3.5 overflow-y-auto pr-2">
                    {division.members.map((member) => (
                        <div
                            key={member.id}
                            className="group/member flex flex-col gap-0.5"
                        >
                            <p className="text-sm font-semibold text-foreground/90 transition-colors group-hover/member:text-foreground">
                                {member.user_name}
                            </p>
                            <div className="relative flex h-5 items-center overflow-hidden">
                                <span
                                    className={cn(
                                        'absolute left-0 rounded-sm border bg-muted px-1.5 py-0.5 text-[10px] whitespace-nowrap text-muted-foreground uppercase transition-all duration-300 ease-out group-hover/member:border-muted-foreground/30',
                                        'translate-y-0 opacity-100 group-hover/member:-translate-y-4 group-hover/member:opacity-0',
                                    )}
                                >
                                    {member.role_label}
                                </span>
                                <span
                                    className={cn(
                                        'absolute left-0 font-medium whitespace-nowrap text-muted-foreground italic transition-all duration-300 ease-out',
                                        'translate-y-4 opacity-0 group-hover/member:translate-y-0 group-hover/member:opacity-100',
                                    )}
                                >
                                    {member.role_type}
                                </span>
                            </div>
                        </div>
                    ))}
                </div>
            </div>

            {isUserDivision && (
                <div className="mt-auto flex items-center justify-between pt-4 text-xs font-bold tracking-tighter text-primary uppercase">
                    <span>View Details</span>
                    <div className="size-1.5 animate-pulse rounded-full bg-primary" />
                </div>
            )}
        </div>
    );

    const className = cn(
        'group relative w-64 flex-none overflow-hidden rounded-2xl border transition-all duration-500 ease-out',
        isUserDivision
            ? 'border-primary/20 bg-card/50 shadow-2xl shadow-primary/5 backdrop-blur-xl hover:border-primary/40 hover:shadow-primary/15 dark:border-primary/30 dark:shadow-primary/10 dark:hover:border-primary/50 dark:hover:shadow-primary/20'
            : 'border-border bg-card/20 hover:border-muted-foreground/30 hover:bg-muted/40 dark:hover:bg-card/40',
    );

    if (clickable) {
        return (
            <Link
                href={divisionShow({ slug: division.slug }).url}
                className={className}
            >
                <div className="absolute inset-0 bg-linear-to-br from-primary/5 via-transparent to-transparent opacity-0 transition-opacity group-hover:opacity-100" />
                {CardContent}
            </Link>
        );
    }

    return <div className={className}>{CardContent}</div>;
}

Divisions.layout = {
    breadcrumbs: [
        {
            title: 'Divisions',
            href: divisionsIndex().url,
        },
    ],
};
