"use client";

import Link from "next/link";
import { usePathname } from "next/navigation";
import { useState, useCallback, useEffect, useRef } from "react";
import {
    ChevronLeft,
    ChevronRight,
    Building2,
    LogOut,
    Zap,
    Pencil,
    GripVertical,
    Check,
    X,
} from "lucide-react";
import { cn } from "@/lib/utils";
import { adminNavigation, type NavGroup, type NavItem } from "@/lib/navigation";
import { useSidebar, MIN_WIDTH, MAX_WIDTH } from "./SidebarContext";

export function Sidebar() {
    const pathname = usePathname();
    const { collapsed, setCollapsed, sidebarWidth, customWidth, setCustomWidth, setIsResizing, isMobile, editMode, setEditMode, triggerDiscard } = useSidebar();
    const [hoveredItem, setHoveredItem] = useState<string | null>(null);
    const [orderedNav, setOrderedNav] = useState<NavGroup[]>(adminNavigation);
    const [originalNav, setOriginalNav] = useState<NavGroup[]>(adminNavigation);
    const [dragItem, setDragItem] = useState<{ groupIdx: number; itemIdx: number } | null>(null);
    const [dragOverItem, setDragOverItem] = useState<{ groupIdx: number; itemIdx: number } | null>(null);
    const sidebarRef = useRef<HTMLElement>(null);

    // Auto-close on mobile after navigation
    useEffect(() => {
        if (isMobile && !collapsed) {
            setCollapsed(true);
        }
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [pathname]);

    // Resize handle drag
    const handleResizeStart = useCallback((e: React.MouseEvent) => {
        if (isMobile) return;
        e.preventDefault();
        setIsResizing(true);
        const startX = e.clientX;
        const startWidth = customWidth;
        const onMove = (ev: MouseEvent) => {
            const delta = ev.clientX - startX;
            setCustomWidth(startWidth + delta);
        };
        const onUp = () => {
            setIsResizing(false);
            document.removeEventListener("mousemove", onMove);
            document.removeEventListener("mouseup", onUp);
            document.body.style.cursor = "";
            document.body.style.userSelect = "";
        };
        document.body.style.cursor = "col-resize";
        document.body.style.userSelect = "none";
        document.addEventListener("mousemove", onMove);
        document.addEventListener("mouseup", onUp);
    }, [customWidth, setCustomWidth, setIsResizing, isMobile]);

    // Drag & drop for reordering
    const handleDragStart = (groupIdx: number, itemIdx: number) => {
        setDragItem({ groupIdx, itemIdx });
    };
    const handleDragOver = (e: React.DragEvent, groupIdx: number, itemIdx: number) => {
        e.preventDefault();
        setDragOverItem({ groupIdx, itemIdx });
    };
    const handleDrop = (groupIdx: number, itemIdx: number) => {
        if (!dragItem) return;
        const newNav = orderedNav.map(g => ({ ...g, items: [...g.items] }));
        const [removed] = newNav[dragItem.groupIdx].items.splice(dragItem.itemIdx, 1);
        newNav[groupIdx].items.splice(itemIdx, 0, removed);
        setOrderedNav(newNav);
        setDragItem(null);
        setDragOverItem(null);
    };
    const isDashboard = (item: NavItem) => item.href === "/admin";

    // On mobile: sidebar is hidden when collapsed, overlays when expanded
    // On desktop: sidebar pushes content
    const mobileExpanded = isMobile && !collapsed;
    const actualWidth = isMobile
        ? (collapsed ? 0 : customWidth)
        : sidebarWidth;

    const displayNav = editMode ? orderedNav : orderedNav;

    return (
        <>
            {/* Mobile backdrop overlay */}
            {mobileExpanded && (
                <div
                    className="fixed inset-0 z-30 bg-black/50 backdrop-blur-sm"
                    onClick={() => setCollapsed(true)}
                />
            )}

            <aside
                ref={sidebarRef}
                className="fixed left-0 top-0 z-40 h-screen flex flex-col transition-all duration-300 ease-in-out"
                style={{
                    width: `${actualWidth}px`,
                    backgroundColor: isMobile && !collapsed ? "rgba(5, 10, 20, 0.95)" : "var(--sidebar-bg)",
                    borderRight: "1px solid rgba(255,255,255,0.04)",
                    transform: isMobile && collapsed ? "translateX(-100%)" : "translateX(0)",
                    backdropFilter: isMobile ? "blur(12px)" : undefined,
                }}
            >
                {/* ── Background glow ── */}
                <div
                    className="absolute top-0 left-0 w-full h-48 pointer-events-none opacity-30"
                    style={{
                        background: "radial-gradient(ellipse at 50% 0%, rgba(212,169,52,0.12) 0%, transparent 70%)",
                    }}
                />

                {/* ── Logo + Collapse button ── */}
                <div className="relative flex items-center justify-between h-[56px] pl-[22px] pr-3" style={{ borderBottom: "1px solid rgba(255,255,255,0.06)" }}>
                    <Link href="/admin" className="flex items-center gap-3 overflow-hidden group">
                        <div
                            className="flex-shrink-0 w-10 h-10 rounded-lg flex items-center justify-center transition-all duration-300 group-hover:scale-105"
                            style={{
                                background: "linear-gradient(135deg, #D4A934 0%, #A67A1A 100%)",
                                boxShadow: "0 4px 12px rgba(212, 169, 52, 0.3)",
                            }}
                        >
                            <Building2 className="w-5 h-5 text-white" />
                        </div>
                        {!collapsed && (
                            <div className="animate-fade-in">
                                <h1
                                    className="text-[14px] font-bold tracking-tight text-white"
                                    style={{ fontFamily: "var(--font-display)" }}
                                >
                                    InmoSpace
                                </h1>
                                <div className="flex items-center gap-1">
                                    <Zap className="w-2.5 h-2.5 text-[#D4A934]" />
                                    <p className="text-[8px] uppercase tracking-[0.2em] text-white/50 font-semibold">
                                        Phoenix
                                    </p>
                                </div>
                            </div>
                        )}
                    </Link>

                    {/* Collapse toggle — top right */}
                    <button
                        onClick={() => setCollapsed(!collapsed)}
                        className="flex-shrink-0 w-9 h-9 rounded-md flex items-center justify-center text-white/25 hover:text-white/60 hover:bg-white/[0.06] transition-all duration-200"
                        title={collapsed ? "Expandir" : "Colapsar"}
                    >
                        {collapsed ? (
                            <ChevronRight className="w-5 h-5" />
                        ) : (
                            <ChevronLeft className="w-5 h-5" />
                        )}
                    </button>
                </div>

                {/* ── Navigation ── */}
                <nav className="flex-1 overflow-y-auto py-4 pl-[30px] pr-4">
                    {displayNav.map((group: NavGroup, groupIndex: number) => (
                        <div key={group.label} className={cn("mb-6", groupIndex === 0 && "mb-5")}>
                            {!collapsed ? (
                                <p className="px-4 mb-2 text-[9px] uppercase tracking-[0.2em] font-bold text-white/40">
                                    {group.label}
                                </p>
                            ) : (
                                groupIndex > 0 && (
                                    <div className="mx-3 mb-3 border-t border-white/[0.05]" />
                                )
                            )}
                            <ul className="space-y-0.5">
                                {group.items.map((item, itemIdx) => {
                                    const isActive =
                                        pathname === item.href ||
                                        (item.href !== "/admin" && pathname.startsWith(item.href));
                                    const isHovered = hoveredItem === item.href;
                                    const Icon = item.icon;
                                    const canDrag = editMode && !isDashboard(item);
                                    const isDragTarget = dragOverItem?.groupIdx === groupIndex && dragOverItem?.itemIdx === itemIdx;

                                    return (
                                        <li
                                            key={item.href}
                                            draggable={canDrag}
                                            onDragStart={() => canDrag && handleDragStart(groupIndex, itemIdx)}
                                            onDragOver={(e) => canDrag && handleDragOver(e, groupIndex, itemIdx)}
                                            onDrop={() => canDrag && handleDrop(groupIndex, itemIdx)}
                                            onDragEnd={() => { setDragItem(null); setDragOverItem(null); }}
                                            style={{
                                                borderTop: isDragTarget ? "2px solid #D4A934" : "2px solid transparent",
                                                opacity: dragItem?.groupIdx === groupIndex && dragItem?.itemIdx === itemIdx ? 0.4 : 1,
                                            }}
                                        >
                                            <Link
                                                href={editMode ? "#" : item.href}
                                                onClick={editMode ? (e) => e.preventDefault() : undefined}
                                                className={cn(
                                                    "relative flex items-center gap-2.5 px-3 py-2 rounded-lg text-[13px] font-medium transition-all duration-200",
                                                    collapsed && "justify-center px-0"
                                                )}
                                                style={{
                                                    color: isActive
                                                        ? "#FFFFFF"
                                                        : isHovered
                                                            ? "rgba(255,255,255,0.9)"
                                                            : "rgba(255,255,255,0.65)",
                                                    backgroundColor: isActive
                                                        ? "rgba(212, 169, 52, 0.12)"
                                                        : isHovered
                                                            ? "rgba(255,255,255,0.04)"
                                                            : "transparent",
                                                    boxShadow: isActive ? "inset 0 0 0 1px rgba(212, 169, 52, 0.15)" : "none",
                                                }}
                                                title={collapsed ? item.label : undefined}
                                                onMouseEnter={() => setHoveredItem(item.href)}
                                                onMouseLeave={() => setHoveredItem(null)}
                                            >
                                                {/* Active bar */}
                                                {isActive && (
                                                    <div
                                                        className="absolute left-0 top-1/2 -translate-y-1/2 w-[3px] h-4 rounded-r-full"
                                                        style={{
                                                            backgroundColor: "#D4A934",
                                                            boxShadow: "0 0 8px rgba(212, 169, 52, 0.5)",
                                                        }}
                                                    />
                                                )}

                                                {/* Drag handle in edit mode */}
                                                {canDrag && !collapsed && (
                                                    <GripVertical className="w-3 h-3 text-white/20 flex-shrink-0 cursor-grab" />
                                                )}

                                                <div
                                                    className={cn(
                                                        "w-7 h-7 rounded-md flex items-center justify-center flex-shrink-0 transition-all duration-200"
                                                    )}
                                                    style={{
                                                        backgroundColor: isActive
                                                            ? "rgba(212, 169, 52, 0.18)"
                                                            : isHovered
                                                                ? "rgba(255,255,255,0.06)"
                                                                : "rgba(255,255,255,0.03)",
                                                    }}
                                                >
                                                    <Icon
                                                        className="w-[15px] h-[15px] transition-all duration-200"
                                                        style={{
                                                            color: isActive
                                                                ? "#D4A934"
                                                                : isHovered
                                                                    ? "rgba(255,255,255,0.7)"
                                                                    : "rgba(255,255,255,0.55)",
                                                        }}
                                                    />
                                                </div>
                                                {!collapsed && <span className="truncate">{item.label}</span>}
                                                {!collapsed && item.badge && (
                                                    <span
                                                        className="ml-auto text-[9px] font-bold px-4 py-0.5 rounded-full"
                                                        style={{ backgroundColor: "#D4A934", color: "#080F1C" }}
                                                    >
                                                        {item.badge}
                                                    </span>
                                                )}
                                            </Link>
                                        </li>
                                    );
                                })}
                            </ul>
                        </div>
                    ))}
                </nav>

                {/* ── Footer ── */}
                <div className="relative pt-2 pb-2 pl-[18px] pr-2 space-y-1.5" style={{ borderTop: "1px solid rgba(255,255,255,0.05)" }}>
                    {/* Edit mode toggle */}
                    <div className={cn("flex flex-col gap-1.5", editMode && !collapsed && "flex-row")}>
                        <button
                            onClick={() => {
                                if (!editMode) setOriginalNav([...orderedNav]);
                                setEditMode(!editMode);
                            }}
                            className={cn(
                                "flex items-center gap-2 px-3 py-2 rounded-lg text-[11px] transition-all duration-200",
                                collapsed && "justify-center",
                                editMode
                                    ? "flex-1 text-emerald-400 bg-emerald-400/10 border border-emerald-400/20"
                                    : "w-full text-white/50 hover:text-white/80 hover:bg-white/[0.03]"
                            )}
                            style={{ marginBottom: "5px", marginRight: "5px" }}
                            title={editMode ? "Guardar cambios" : "Editar menú"}
                        >
                            {editMode ? (
                                <>
                                    <Check className="w-4 h-4" />
                                    {!collapsed && <span className="font-medium">Guardar</span>}
                                </>
                            ) : (
                                <>
                                    <Pencil className="w-3.5 h-3.5" />
                                    {!collapsed && <span>Editar menú</span>}
                                </>
                            )}
                        </button>

                        {editMode && (
                            <button
                                onClick={() => {
                                    setOrderedNav([...originalNav]);
                                    setEditMode(false);
                                    triggerDiscard();
                                }}
                                className={cn(
                                    "flex items-center gap-2 px-3 py-2 rounded-lg text-[11px] transition-all duration-200 text-rose-400 bg-rose-400/10 border border-rose-400/20",
                                    collapsed ? "justify-center" : "flex-1"
                                )}
                                style={{ marginBottom: "5px", marginRight: "5px" }}
                                title="Descartar cambios"
                            >
                                <X className="w-4 h-4" />
                                {!collapsed && <span className="font-medium">Descartar</span>}
                            </button>
                        )}
                    </div>
                </div>

                {/* ── Resize handle ── */}
                {!collapsed && (
                    <div
                        className="absolute top-0 right-0 w-[4px] h-full cursor-col-resize z-50 group"
                        onMouseDown={handleResizeStart}
                    >
                        <div className="w-full h-full transition-colors duration-150 group-hover:bg-[#D4A934]/40 group-active:bg-[#D4A934]/60" />
                    </div>
                )}
            </aside>
        </>
    );
}
