import AppLayout from '@/layouts/app-layout';
import { Head, router } from '@inertiajs/react';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import { buttonVariants } from '@/components/ui/button';
import React, { useEffect, useState } from 'react';

interface UserReportRow {
    id: number;
    name: string;
    email: string;
    residency_program: string | null;
    total_points: number;
    unique_questions_total: number;
    unique_questions_app: number;
    unique_questions_web: number;
    questions_total: number;
    questions_app: number;
    questions_web: number;
    usage_days_total: number;
    usage_days_app: number;
    usage_days_web: number;
    minutes_total: number;
    minutes_app: number;
    minutes_web: number;
    days_email_notifications_on: number;
    days_app_notifications_on: number;
    days_daily_quest: number;
    days_weekly_quest: number;
}

interface PaginatedUsers {
    data: UserReportRow[];
    current_page: number;
    last_page: number;
    per_page: number;
    total: number;
}

interface Filters {
    search: string;
}

interface Props {
    users: PaginatedUsers;
    filters: Filters;
}

export default function Index({ users, filters }: Props) {
    const [fromDate, setFromDate] = useState('');
    const [toDate, setToDate] = useState('');
    const [searchInput, setSearchInput] = useState(filters.search ?? '');
    const debounceTimerRef = React.useRef<NodeJS.Timeout | null>(null);

    useEffect(() => {
        setSearchInput(filters.search ?? '');
    }, [filters.search]);

    const runExport = () => {
        const params: Record<string, string> = {};
        if (fromDate) params.from = fromDate;
        if (toDate) params.to = toDate;
        if (filters.search) params.search = filters.search;

        const exportUrl = route('user.exportCsv', params);
        window.location.href = exportUrl;
    };

    const navigate = (params: Record<string, any>) => {
        router.get(window.location.pathname, params, { preserveState: true, replace: true });
    };

    const currentParams = () => Object.fromEntries(new URLSearchParams(window.location.search).entries());

    const onPageChange = (page: number) => navigate({ ...currentParams(), page });
    const onPerPageChange = (perPage: number) => navigate({ ...currentParams(), page: 1, per_page: perPage });
    const onSearchChange = (searchVal: string) => {
        const params = currentParams();
        if (searchVal) {
            params.search = searchVal;
        } else {
            delete params.search;
        }
        navigate({ ...params, page: 1 });
    };

    const totalPages = Math.max(1, Math.ceil(users.total / users.per_page));
    const startItem = (users.current_page - 1) * users.per_page + 1;
    const endItem = Math.min(startItem + users.data.length - 1, users.total);

    const formatMinutes = (val: number | null) => (val !== null && val !== undefined ? Number(val).toFixed(2) : '—');
    const formatVal = (val: any) => (val === null || val === undefined || val === '' ? '—' : val);

    return (
        <AppLayout breadcrumbs={[{ title: 'User Report', href: '/user' }]}>
            <Head title="User Report" />

            <div className="m-5">
                <Card>
                    <CardHeader>
                        <div className="flex flex-wrap items-center justify-between gap-3">
                            <h1 className="text-2xl font-semibold text-gray-800 dark:text-white">User Report</h1>
                            {/* <button type="button" className={buttonVariants({ variant: 'outline' })} onClick={runExport}>
                                Run report (export CSV)
                            </button> */}
                        </div>

                        <div className="mt-4 flex flex-wrap items-end gap-3">
                            <div className="flex flex-col gap-1">
                                <label htmlFor="from-date" className="text-sm font-medium">
                                    Export data from
                                </label>
                                <input
                                    id="from-date"
                                    type="date"
                                    value={fromDate}
                                    onChange={(e) => setFromDate(e.target.value)}
                                    className="h-9 rounded-md border px-3 text-sm"
                                />
                            </div>

                            <div className="flex flex-col gap-1">
                                <label htmlFor="to-date" className="text-sm font-medium">
                                    To
                                </label>
                                <input
                                    id="to-date"
                                    type="date"
                                    value={toDate}
                                    onChange={(e) => setToDate(e.target.value)}
                                    className="h-9 rounded-md border px-3 text-sm"
                                />
                            </div>

                            <button
                                type="button"
                                className={buttonVariants({ variant: 'default' })}
                                onClick={runExport}
                            >
                                Export with date range
                            </button>
                        </div>
                    </CardHeader>

                    <CardContent>
                        {/* Controls */}
                        <div className="flex flex-col sm:flex-row justify-between items-center mb-4 gap-4">
                            <div className="flex gap-2 items-center">
                                <label className="text-sm text-gray-600 dark:text-white">Rows per page:</label>
                                <select
                                    value={users.per_page}
                                    onChange={(e) => onPerPageChange(Number(e.target.value))}
                                    className="border px-2 py-1 rounded dark:bg-black"
                                >
                                    {[10, 25, 50, 100, 500].map((n) => (
                                        <option key={n} value={n}>
                                            {n}
                                        </option>
                                    ))}
                                </select>
                            </div>

                            <input
                                type="text"
                                placeholder="Search..."
                                value={searchInput}
                                onChange={(e) => {
                                    const value = e.target.value;
                                    setSearchInput(value);
                                    if (debounceTimerRef.current) {
                                        clearTimeout(debounceTimerRef.current);
                                    }
                                    debounceTimerRef.current = setTimeout(() => {
                                        onSearchChange(value);
                                    }, 500);
                                }}
                                className="border px-3 py-1 rounded w-full dark:text-white sm:w-auto"
                            />
                        </div>

                        <div className="text-sm text-gray-600 dark:text-white my-2">
                            Showing {users.data.length > 0 ? `${startItem} to ${endItem}` : '0'} of {users.total} entries
                        </div>

                        {/* Table with grouped headers */}
                        <div className="overflow-x-auto">
                            <div className="rounded-lg overflow-hidden border">
                                <table className="min-w-full border-separate border-spacing-0">
                                    <thead>
                                        {/* Group header row */}
                                        <tr className="bg-gray-100 dark:bg-black">
                                            <th rowSpan={2} className="px-4 py-2 text-left border-b border-r border-gray-200 dark:border-gray-700 rounded-tl-lg align-bottom">Name</th>
                                            <th rowSpan={2} className="px-4 py-2 text-left border-b border-r border-gray-200 dark:border-gray-700 align-bottom">Email</th>
                                            <th rowSpan={2} className="px-4 py-2 text-left border-b border-r border-gray-200 dark:border-gray-700 align-bottom">Residency Program</th>
                                            <th rowSpan={2} className="px-4 py-2 text-left border-b border-r border-gray-200 dark:border-gray-700 align-bottom">Total Points</th>

                                            <th colSpan={3} className="px-4 py-2 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-blue-50 dark:bg-blue-950">Unique Q Completed</th>
                                            <th colSpan={3} className="px-4 py-2 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-purple-50 dark:bg-purple-950">Q Completed With Repeats</th>
                                            <th colSpan={3} className="px-4 py-2 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-teal-50 dark:bg-teal-950">Unique Usage Days</th>
                                            <th colSpan={3} className="px-4 py-2 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-amber-50 dark:bg-amber-950">Time Spent (Minutes)</th>

                                            <th rowSpan={2} className="px-4 py-2 text-left border-b border-r border-gray-200 dark:border-gray-700 align-bottom">Days Email Notif. On</th>
                                            <th rowSpan={2} className="px-4 py-2 text-left border-b border-r border-gray-200 dark:border-gray-700 align-bottom">Days App Notif. On</th>
                                            <th rowSpan={2} className="px-4 py-2 text-left border-b border-r border-gray-200 dark:border-gray-700 align-bottom">Days Daily Quest</th>
                                            <th rowSpan={2} className="px-4 py-2 text-left border-b border-gray-200 dark:border-gray-700 rounded-tr-lg align-bottom">Days Weekly Quest</th>
                                        </tr>

                                        {/* Sub-header row for grouped columns */}
                                        <tr className="bg-gray-50 dark:bg-gray-900 text-sm">
                                            {/* Unique Q Completed */}
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-blue-50/50 dark:bg-blue-950/50 font-medium">Total</th>
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-blue-50/50 dark:bg-blue-950/50 font-medium">Web</th>
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-blue-50/50 dark:bg-blue-950/50 font-medium">App</th>

                                            {/* Q Completed Incl Repeats */}
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-purple-50/50 dark:bg-purple-950/50 font-medium">Total</th>
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-purple-50/50 dark:bg-purple-950/50 font-medium">Web</th>
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-purple-50/50 dark:bg-purple-950/50 font-medium">App</th>

                                            {/* Unique Usage Days */}
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-teal-50/50 dark:bg-teal-950/50 font-medium">Total</th>
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-teal-50/50 dark:bg-teal-950/50 font-medium">Web</th>
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-teal-50/50 dark:bg-teal-950/50 font-medium">App</th>

                                            {/* Time Spent Minutes */}
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-amber-50/50 dark:bg-amber-950/50 font-medium">Total</th>
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-amber-50/50 dark:bg-amber-950/50 font-medium">Web</th>
                                            <th className="px-3 py-1.5 text-center border-b border-r border-gray-200 dark:border-gray-700 bg-amber-50/50 dark:bg-amber-950/50 font-medium">App</th>
                                        </tr>
                                    </thead>

                                    <tbody>
                                        {users.data.length === 0 ? (
                                            <tr>
                                                <td colSpan={20} className="text-center py-4 text-gray-500">
                                                    No data found.
                                                </td>
                                            </tr>
                                        ) : (
                                            users.data.map((row, rowIndex) => (
                                                <tr key={row.id} className="border-t hover:bg-gray-50 dark:hover:bg-gray-800">
                                                    <td className="px-4 py-2 border-r border-gray-100 dark:border-gray-800">{formatVal(row.name)}</td>
                                                    <td className="px-4 py-2 border-r border-gray-100 dark:border-gray-800">{formatVal(row.email)}</td>
                                                    <td className="px-4 py-2 border-r border-gray-100 dark:border-gray-800">{formatVal(row.residency_program)}</td>
                                                    <td className="px-4 py-2 border-r border-gray-100 dark:border-gray-800 font-medium">{formatVal(row.total_points)}</td>

                                                    {/* Unique Q Completed */}
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-blue-50/30 dark:bg-blue-950/20 font-semibold">{formatVal(row.unique_questions_total)}</td>
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-blue-50/30 dark:bg-blue-950/20">{formatVal(row.unique_questions_web)}</td>
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-blue-50/30 dark:bg-blue-950/20">{formatVal(row.unique_questions_app)}</td>

                                                    {/* Q Completed Incl Repeats */}
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-purple-50/30 dark:bg-purple-950/20 font-semibold">{formatVal(row.questions_total)}</td>
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-purple-50/30 dark:bg-purple-950/20">{formatVal(row.questions_web)}</td>
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-purple-50/30 dark:bg-purple-950/20">{formatVal(row.questions_app)}</td>

                                                    {/* Unique Usage Days */}
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-teal-50/30 dark:bg-teal-950/20 font-semibold">{formatVal(row.usage_days_total)}</td>
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-teal-50/30 dark:bg-teal-950/20">{formatVal(row.usage_days_web)}</td>
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-teal-50/30 dark:bg-teal-950/20">{formatVal(row.usage_days_app)}</td>

                                                    {/* Time Spent Minutes */}
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-amber-50/30 dark:bg-amber-950/20 font-semibold">{formatMinutes(row.minutes_total)}</td>
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-amber-50/30 dark:bg-amber-950/20">{formatMinutes(row.minutes_web)}</td>
                                                    <td className="px-3 py-2 text-center border-r border-gray-100 dark:border-gray-800 bg-amber-50/30 dark:bg-amber-950/20">{formatMinutes(row.minutes_app)}</td>

                                                    <td className="px-4 py-2 border-r border-gray-100 dark:border-gray-800 text-center">{formatVal(row.days_email_notifications_on)}</td>
                                                    <td className="px-4 py-2 border-r border-gray-100 dark:border-gray-800 text-center">{formatVal(row.days_app_notifications_on)}</td>
                                                    <td className="px-4 py-2 border-r border-gray-100 dark:border-gray-800 text-center">{formatVal(row.days_daily_quest)}</td>
                                                    <td className="px-4 py-2 text-center">{formatVal(row.days_weekly_quest)}</td>
                                                </tr>
                                            ))
                                        )}
                                    </tbody>
                                </table>
                            </div>
                        </div>

                        {/* Pagination */}
                        <div className="mt-4 flex justify-end items-end flex-wrap gap-1 text-sm">
                            <button
                                onClick={() => onPageChange(users.current_page - 1)}
                                disabled={users.current_page === 1}
                                className="px-3 py-1 hover:bg-gray-300 rounded dark:bg-white dark:text-black disabled:opacity-50"
                            >
                                Previous
                            </button>

                            {Array.from({ length: totalPages }, (_, i) => i + 1)
                                .filter((page) => {
                                    return (
                                        page === 1 ||
                                        page === totalPages ||
                                        (page >= users.current_page - 1 && page <= users.current_page + 1)
                                    );
                                })
                                .reduce<number[]>((acc, page, i, arr) => {
                                    if (i > 0 && page - arr[i - 1] > 1) {
                                        acc.push(-1);
                                    }
                                    acc.push(page);
                                    return acc;
                                }, [])
                                .map((page, i) =>
                                    page === -1 ? (
                                        <span key={`ellipsis-${i}`} className="px-2">...</span>
                                    ) : (
                                        <button
                                            key={page}
                                            onClick={() => onPageChange(page)}
                                            className={`px-3 py-1 rounded ${users.current_page === page
                                                    ? 'bg-gray-700 text-white dark:text-white'
                                                    : 'bg-gray-200 hover:bg-gray-300 dark:bg-white dark:text-black'
                                                }`}
                                        >
                                            {page}
                                        </button>
                                    )
                                )}

                            <button
                                onClick={() => onPageChange(users.current_page + 1)}
                                disabled={users.current_page === totalPages}
                                className="px-3 py-1 hover:bg-gray-300 dark:bg-white dark:text-black rounded disabled:opacity-50"
                            >
                                Next
                            </button>
                        </div>
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}
