import React, { useMemo, useRef, useState } from 'react';
import { Head } from '@inertiajs/react';
import AppLayout from '@/Layouts/AppLayout';
import {
    ChevronRight,
    ClipboardList,
    Clock3,
    Heart,
    Home,
    LockKeyhole,
    LogOut,
    MapPin,
    PackageCheck,
    RefreshCcw,
    Star,
    Truck,
    User,
    UserCircle2,
    XCircle,
    Box,
    Store,
    Upload,
} from 'lucide-react';

const menuIconMap = {
    dashboard: Home,
    profile: User,
    orders: ClipboardList,
    returns: RefreshCcw,
    favorites: Heart,
    reviews: Star,
    addresses: MapPin,
    password: LockKeyhole,
    'track-order': Truck,
    logout: LogOut,
};

const summaryIconMap = {
    pending: Clock3,
    processing: Box,
    delivered: PackageCheck,
    cancelled: XCircle,
};

const summaryColorMap = {
    yellow: 'bg-orange-100 text-orange-500',
    blue: 'bg-blue-100 text-blue-600',
    green: 'bg-green-100 text-green-600',
    red: 'bg-red-100 text-red-600',
};

function taka(value) {
    return `৳ ${Number(value || 0).toFixed(2)}`;
}

function StatusBadge({ status }) {
    const normalized = String(status || '').toLowerCase();

    const classes =
        normalized === 'pending'
            ? 'bg-orange-50 text-[#FD7101] border border-orange-100'
            : normalized === 'processing'
              ? 'bg-blue-50 text-blue-600 border border-blue-100'
              : normalized === 'delivered'
                ? 'bg-green-50 text-green-600 border border-green-100'
                : normalized === 'cancelled'
                  ? 'bg-red-50 text-red-600 border border-red-100'
                  : 'bg-slate-100 text-slate-600 border border-slate-200';

    return (
        <span
            className={`inline-flex rounded-full px-3 py-1 text-xs font-semibold ${classes}`}
        >
            {status}
        </span>
    );
}

function StatCard({ item }) {
    const Icon = summaryIconMap[item.key] || Box;
    const colorClass = summaryColorMap[item.color] || 'bg-slate-100 text-slate-600';

    return (
        <div className="rounded-2xl border border-slate-200 bg-white p-4 shadow-sm transition hover:shadow-md">
            <div
                className={`mb-4 flex h-12 w-12 items-center justify-center rounded-full ${colorClass}`}
            >
                <Icon size={20} />
            </div>

            <p className="text-[14px] font-medium text-slate-700">{item.title}</p>
            <h3 className="mt-1 text-[30px] font-semibold leading-none text-slate-900">
                {item.count}
            </h3>
        </div>
    );
}

function SideMenuItem({ item, active = false, onClick }) {
    const Icon = menuIconMap[item.key] || ChevronRight;

    return (
        <button
            type="button"
            onClick={onClick}
            className={`flex w-full items-center gap-3 rounded-xl px-4 py-3 text-left transition ${
                active
                    ? 'bg-orange-50 text-[#FD7101]'
                    : 'text-slate-600 hover:bg-slate-50 hover:text-slate-900'
            }`}
        >
            <span className={active ? 'text-[#FD7101]' : 'text-slate-400'}>
                <Icon size={20} />
            </span>
            <span className="text-[16px] font-medium">{item.name}</span>
        </button>
    );
}

function MobileMenuCard({ item, active = false, onClick }) {
    const Icon = menuIconMap[item.key] || ChevronRight;

    return (
        <button
            type="button"
            onClick={onClick}
            className={`rounded-2xl border p-4 text-left shadow-sm transition active:scale-[0.98] ${
                active
                    ? 'border-orange-200 bg-orange-50 text-[#FD7101]'
                    : 'border-slate-200 bg-white text-slate-700 hover:border-orange-100 hover:bg-orange-50/40'
            }`}
        >
            <div
                className={`mb-3 flex h-11 w-11 items-center justify-center rounded-full ${
                    active
                        ? 'bg-white text-[#FD7101]'
                        : 'bg-slate-100 text-slate-500'
                }`}
            >
                <Icon size={20} />
            </div>

            <div className="flex items-center justify-between gap-3">
                <span className="text-[15px] font-semibold">{item.name}</span>
                <ChevronRight size={17} />
            </div>
        </button>
    );
}

function ProductCell({ order }) {
    return (
        <div className="flex min-w-[220px] items-center gap-3">
            <div className="h-[52px] w-[52px] shrink-0 overflow-hidden rounded-xl border border-slate-200 bg-slate-50">
                {order.image ? (
                    <img
                        src={order.image}
                        alt={order.product_name}
                        className="h-full w-full object-cover"
                    />
                ) : (
                    <div className="flex h-full w-full items-center justify-center text-slate-300">
                        <Box size={20} />
                    </div>
                )}
            </div>

            <div className="min-w-0">
                <h4 className="line-clamp-2 text-sm font-semibold leading-5 text-slate-900">
                    {order.product_name}
                </h4>
                <p className="mt-1 text-xs text-slate-400">{order.sku}</p>
            </div>
        </div>
    );
}

function RecentOrdersTable({ recentOrders = [] }) {
    return (
        <div className="hidden overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm md:block">
            <div className="overflow-x-auto">
                <table className="min-w-full border-separate border-spacing-0">
                    <thead>
                        <tr className="bg-slate-50">
                            <th className="whitespace-nowrap border-b border-slate-200 px-4 py-4 text-left text-sm font-semibold text-slate-600">
                                Order No
                            </th>
                            <th className="whitespace-nowrap border-b border-slate-200 px-4 py-4 text-left text-sm font-semibold text-slate-600">
                                Product
                            </th>
                            <th className="whitespace-nowrap border-b border-slate-200 px-4 py-4 text-left text-sm font-semibold text-slate-600">
                                Price
                            </th>
                            <th className="whitespace-nowrap border-b border-slate-200 px-4 py-4 text-left text-sm font-semibold text-slate-600">
                                Qty
                            </th>
                            <th className="whitespace-nowrap border-b border-slate-200 px-4 py-4 text-left text-sm font-semibold text-slate-600">
                                Total
                            </th>
                            <th className="whitespace-nowrap border-b border-slate-200 px-4 py-4 text-left text-sm font-semibold text-slate-600">
                                Status
                            </th>
                        </tr>
                    </thead>

                    <tbody>
                        {recentOrders.length > 0 ? (
                            recentOrders.map((order) => (
                                <tr
                                    key={order.id}
                                    className="transition hover:bg-orange-50/40"
                                >
                                    <td className="border-b border-slate-100 px-4 py-4 align-top">
                                        <div className="min-w-[160px]">
                                            <p className="text-sm text-slate-500">
                                                #{order.id}
                                            </p>
                                            <p className="mt-1 text-xs text-slate-400">
                                                {order.placed_on}
                                            </p>
                                        </div>
                                    </td>

                                    <td className="border-b border-slate-100 px-4 py-4 align-top">
                                        <ProductCell order={order} />
                                    </td>

                                    <td className="border-b border-slate-100 px-4 py-4 align-top">
                                        <span className="whitespace-nowrap text-sm font-semibold text-slate-900">
                                            {taka(order.price)}
                                        </span>
                                    </td>

                                    <td className="border-b border-slate-100 px-4 py-4 align-top">
                                        <span className="whitespace-nowrap text-sm font-semibold text-[#FD7101]">
                                            {order.qty}
                                        </span>
                                    </td>

                                    <td className="border-b border-slate-100 px-4 py-4 align-top">
                                        <span className="whitespace-nowrap text-sm font-semibold text-slate-900">
                                            {taka(order.total)}
                                        </span>
                                    </td>

                                    <td className="border-b border-slate-100 px-4 py-4 align-top">
                                        <StatusBadge status={order.status} />
                                    </td>
                                </tr>
                            ))
                        ) : (
                            <tr>
                                <td
                                    colSpan={6}
                                    className="px-4 py-10 text-center text-sm text-slate-400"
                                >
                                    No recent order found
                                </td>
                            </tr>
                        )}
                    </tbody>
                </table>
            </div>
        </div>
    );
}

function RecentOrdersMobileCards({ recentOrders = [] }) {
    if (!recentOrders.length) {
        return (
            <div className="rounded-2xl border border-slate-200 bg-white px-4 py-10 text-center text-sm text-slate-400 md:hidden">
                No recent order found
            </div>
        );
    }

    return (
        <div className="space-y-3 md:hidden">
            {recentOrders.map((order) => (
                <div
                    key={order.id}
                    className="rounded-2xl border border-slate-200 bg-white p-4 shadow-sm"
                >
                    <div className="flex items-start gap-3">
                        <div className="h-[58px] w-[58px] shrink-0 overflow-hidden rounded-xl border border-slate-200 bg-slate-50">
                            {order.image ? (
                                <img
                                    src={order.image}
                                    alt={order.product_name}
                                    className="h-full w-full object-cover"
                                />
                            ) : (
                                <div className="flex h-full w-full items-center justify-center text-slate-300">
                                    <Box size={20} />
                                </div>
                            )}
                        </div>

                        <div className="min-w-0 flex-1">
                            <div className="mb-2 flex items-start justify-between gap-2">
                                <div>
                                    <p className="text-xs text-slate-400">
                                        #{order.id}
                                    </p>
                                    <h4 className="mt-1 line-clamp-2 text-sm font-semibold leading-5 text-slate-900">
                                        {order.product_name}
                                    </h4>
                                </div>

                                <StatusBadge status={order.status} />
                            </div>

                            <p className="text-xs text-slate-400">{order.placed_on}</p>
                        </div>
                    </div>

                    <div className="mt-4 grid grid-cols-3 gap-2 rounded-xl bg-slate-50 p-3 text-center">
                        <div>
                            <p className="text-[11px] text-slate-400">Price</p>
                            <p className="mt-1 text-xs font-semibold text-slate-900">
                                {taka(order.price)}
                            </p>
                        </div>

                        <div>
                            <p className="text-[11px] text-slate-400">Qty</p>
                            <p className="mt-1 text-xs font-semibold text-[#FD7101]">
                                {order.qty}
                            </p>
                        </div>

                        <div>
                            <p className="text-[11px] text-slate-400">Total</p>
                            <p className="mt-1 text-xs font-semibold text-slate-900">
                                {taka(order.total)}
                            </p>
                        </div>
                    </div>
                </div>
            ))}
        </div>
    );
}

function EmptyOptionBox({ activeItem }) {
    const Icon = menuIconMap[activeItem?.key] || Home;

    return (
        <div className="mt-5 rounded-2xl border border-dashed border-orange-200 bg-orange-50/40 p-5 md:hidden">
            <div className="flex items-center gap-3">
                <div className="flex h-11 w-11 items-center justify-center rounded-full bg-white text-[#FD7101]">
                    <Icon size={20} />
                </div>

                <div>
                    <h3 className="text-base font-semibold text-slate-900">
                        {activeItem?.name || 'Dashboard'}
                    </h3>
                    <p className="mt-1 text-sm text-slate-500">
                        {/* Static card selected. Link/route পরে add করা যাবে। */}
                    </p>
                </div>
            </div>
        </div>
    );
}

export default function Dashboard({
    user = {},
    summary = [],
    menuItems = [],
    recentOrders = [],
}) {
    const fileInputRef = useRef(null);

    const safeMenuItems = useMemo(() => {
        if (menuItems.length) return menuItems;

        return [
            { key: 'dashboard', name: 'Dashboard' },
            { key: 'profile', name: 'Profile' },
            { key: 'orders', name: 'Orders' },
            { key: 'returns', name: 'Returns' },
            { key: 'favorites', name: 'Favorites' },
            { key: 'reviews', name: 'Reviews' },
            { key: 'addresses', name: 'Addresses' },
            { key: 'password', name: 'Password' },
            { key: 'track-order', name: 'Track Order' },
            { key: 'logout', name: 'Logout' },
        ];
    }, [menuItems]);

    const [activeKey, setActiveKey] = useState(safeMenuItems[0]?.key || 'dashboard');
    const [avatarPreview, setAvatarPreview] = useState(user.avatar || '');

    const activeItem =
        safeMenuItems.find((item) => item.key === activeKey) || safeMenuItems[0];

    const handleImageUpload = (event) => {
        const file = event.target.files?.[0];

        if (!file) return;

        if (!file.type.startsWith('image/')) {
            event.target.value = '';
            return;
        }

        const imageUrl = URL.createObjectURL(file);
        setAvatarPreview(imageUrl);
    };

    return (
        <AppLayout>
            <Head title="Mobile Dashboard" />

            <div
                className="min-h-screen bg-slate-100"
                style={{ fontFamily: "'Poppins', sans-serif" }}
            >
                <div className="mx-auto max-w-7xl px-3 py-4 sm:px-4 lg:px-6">
                    <div className="mb-4 flex flex-wrap items-center gap-2 text-[14px] text-slate-500">
                        <span className="inline-flex items-center gap-2 font-medium text-slate-700">
                            <Home size={14} />
                            Home
                        </span>
                        <ChevronRight size={14} />
                        <span>Dashboard</span>
                    </div>

                    <div className="grid grid-cols-1 gap-4 lg:grid-cols-[320px_minmax(0,1fr)]">
                        <aside className="rounded-2xl border border-slate-200 bg-white p-4 shadow-sm">
                            <div className="border-b border-slate-200 pb-4">
                                <div className="flex flex-col items-center text-center">
                                    <div className="relative">
                                        <div className="flex h-20 w-20 items-center justify-center overflow-hidden rounded-full bg-slate-100 text-slate-500">
                                            {avatarPreview ? (
                                                <img
                                                    src={avatarPreview}
                                                    alt={user.name || 'User'}
                                                    className="h-full w-full object-cover"
                                                />
                                            ) : (
                                                <UserCircle2 size={40} />
                                            )}
                                        </div>

                                        <button
                                            type="button"
                                            onClick={() => fileInputRef.current?.click()}
                                            className="absolute -bottom-1 -right-1 flex h-8 w-8 items-center justify-center rounded-full bg-[#FD7101] text-white shadow-md transition hover:opacity-90"
                                            aria-label="Upload profile image"
                                        >
                                            <Upload size={15} />
                                        </button>

                                        <input
                                            ref={fileInputRef}
                                            type="file"
                                            accept="image/*"
                                            onChange={handleImageUpload}
                                            className="hidden"
                                        />
                                    </div>

                                    <h2 className="mt-4 text-[32px] font-semibold leading-none text-slate-900 sm:text-[28px]">
                                        {user.name || 'User Name'}
                                    </h2>

                                    <p className="mt-2 text-[15px] text-slate-500">
                                        Member Since {user.member_since || 'N/A'}
                                    </p>
                                </div>
                            </div>

                            {/* Desktop menu: same as previous sidebar */}
                            <div className="hidden pt-4 lg:block">
                                <h3 className="mb-3 text-[15px] font-semibold uppercase tracking-wide text-slate-600">
                                    My Account
                                </h3>

                                <div className="space-y-1">
                                    {safeMenuItems.map((item) => (
                                        <SideMenuItem
                                            key={item.key}
                                            item={item}
                                            active={activeKey === item.key}
                                            onClick={() => setActiveKey(item.key)}
                                        />
                                    ))}
                                </div>
                            </div>

                            {/* Mobile menu: static cards */}
                            <div className="pt-4 lg:hidden">
                                <h3 className="mb-3 text-[15px] font-semibold uppercase tracking-wide text-slate-600">
                                    My Account
                                </h3>

                                <div className="grid grid-cols-2 gap-3 sm:grid-cols-3">
                                    {safeMenuItems.map((item) => (
                                        <MobileMenuCard
                                            key={item.key}
                                            item={item}
                                            active={activeKey === item.key}
                                            onClick={() => setActiveKey(item.key)}
                                        />
                                    ))}
                                </div>

                                <EmptyOptionBox activeItem={activeItem} />
                            </div>
                        </aside>

                        <section className="rounded-2xl border border-slate-200 bg-white p-4 shadow-sm sm:p-5 lg:p-6">
                            <div className="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
                                <div>
                                    <h1 className="text-[34px] font-semibold leading-none text-slate-900 sm:text-[30px]">
                                        {activeItem?.name || 'Dashboard'}
                                    </h1>

                                    <p className="mt-2 text-sm text-slate-500 lg:hidden">
                                        {/* Mobile card click করলে এই selected option দেখাবে। */}
                                    </p>
                                </div>
                            </div>

                            <div className="mt-5 grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
                                {summary.map((item) => (
                                    <StatCard key={item.key} item={item} />
                                ))}
                            </div>

                            <div className="mt-7">
                                <div className="mb-4 flex items-center justify-between gap-3">
                                    <h2 className="text-[28px] font-semibold text-slate-900 sm:text-[24px]">
                                        Recent Orders
                                    </h2>

                                    <button
                                        type="button"
                                        className="text-[16px] font-semibold text-[#FD7101] hover:opacity-80"
                                    >
                                        See all
                                    </button>
                                </div>

                                <RecentOrdersTable recentOrders={recentOrders} />
                                <RecentOrdersMobileCards recentOrders={recentOrders} />
                            </div>

                            <div className="mt-8 rounded-2xl border border-slate-200 bg-white p-4 shadow-sm">
                                <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
                                    <div className="min-w-0">
                                        <h3 className="text-[28px] font-semibold text-slate-900 sm:text-[24px]">
                                            Want to Sell with Us?
                                        </h3>
                                        <p className="mt-2 text-[16px] text-slate-500">
                                            Easy Tracking, fast Payment, and safe Delivery across country.
                                        </p>
                                    </div>

                                    <button
                                        type="button"
                                        className="inline-flex items-center justify-center gap-2 rounded-xl bg-[#FD7101] px-6 py-3 text-[16px] font-semibold text-white transition hover:opacity-90"
                                    >
                                        <Store size={18} />
                                        Become a Seller
                                    </button>
                                </div>
                            </div>
                        </section>
                    </div>
                </div>
            </div>
        </AppLayout>
    );
}