import { PropsWithChildren, ReactNode, Fragment, useEffect, useState } from "react";
import {AppSidebar} from "@/components/app-sidebar";
import {SidebarInset, SidebarProvider, SidebarTrigger} from "@/components/ui/sidebar";
import {Separator} from "@/components/ui/separator";
import {
    Breadcrumb,
    BreadcrumbItem,
    BreadcrumbList,
    BreadcrumbPage,
    BreadcrumbLink,
    BreadcrumbSeparator,
    BreadcrumbEllipsis,
} from "@/components/ui/breadcrumb";
import { NavUser } from "@/components/nav-user";
import { usePage, Head, Link, router } from "@inertiajs/react";
import { PageProps } from "@/types";
import { BrandProvider, useBrand } from "@/contexts/brand-context";
import CookieConsent from "@/components/cookie-consent";
import { useFavicon } from "@/hooks/use-favicon";
import { useTranslation } from 'react-i18next';
import { Button } from "@/components/ui/button";
import { UserX, ArrowLeft } from "lucide-react";
import { useFlashMessages } from "@/hooks/useFlashMessages";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";

function AuthenticatedLayoutContent({
    header,
    children,
    breadcrumbs,
    pageTitle,
    pageDescription,
    pageActions,
    backUrl,
    className,
    ...props
}: PropsWithChildren<{
    header?: ReactNode;
    breadcrumbs?: Array<{label: string, url?: string}>;
    pageTitle?: string;
    pageDescription?: ReactNode;
    pageActions?: ReactNode;
    backUrl?: string;
    className?: string;
}>) {
    const { t } = useTranslation();
    const { auth, companyAllSetting, adminAllSetting } = usePage<PageProps>().props as any;
    const { settings } = useBrand();
    useFavicon();
    useFlashMessages();

    return (
        <>
        <Head>
            {companyAllSetting?.metaKeywords && (
                <meta name="keywords" content={companyAllSetting.metaKeywords} />
            )}
            {companyAllSetting?.metaDescription && (
                <meta name="description" content={companyAllSetting.metaDescription} />
            )}
            {companyAllSetting?.metaImage && (
                <meta property="og:image" content={companyAllSetting.metaImage} />
            )}
        </Head>
        <div
            className={settings.layoutDirection === 'rtl' ? 'rtl' : 'ltr'}
            data-theme={settings.themeMode}
            dir={settings.layoutDirection === 'rtl' ? 'rtl' : 'ltr'}
            style={{ direction: settings.layoutDirection === 'rtl' ? 'rtl' : 'ltr' }}
        >
        <SidebarProvider defaultOpen={true}>
            <AppSidebar />

            <SidebarInset className="overflow-visible"
                style={{ direction: settings.layoutDirection === 'rtl' ? 'rtl' : 'ltr' }}
                dir={settings.layoutDirection === 'rtl' ? 'rtl' : 'ltr'}
            >
                <header
                    className={`bg-background flex h-auto min-h-12 shrink-0 items-center gap-2 px-3 py-2 border-b mb-2 justify-between sm:h-12 sm:px-6 lg:px-8 xl:px-12 sm:py-1`}
                    >
                    {/* Sidebar + Breadcrumb */}
                    <div className={`flex items-center gap-2`} >
                        {/* SidebarTrigger */}
                        <SidebarTrigger className="ltr:-ml-1 rtl:-mr-1" />

                        {/* Separator */}
                        <Separator orientation="vertical" className="ltr:mr-2 rtl:ml-2 h-4 hidden md:block" />

                        {/* Breadcrumb */}
                        <Breadcrumb className="hidden md:block">
                            <BreadcrumbList className="flex items-center">
                                <BreadcrumbItem>
                                    <BreadcrumbLink asChild>
                                        <Link href={route("dashboard")}>{t('Dashboard')}</Link>
                                    </BreadcrumbLink>
                                </BreadcrumbItem>

                                {/* Desktop View (lg): show all breadcrumbs */}
                                {breadcrumbs?.map((crumb, index) => (
                                    <Fragment key={`desktop-${index}`}>
                                        <BreadcrumbSeparator className={`hidden lg:list-item ${settings.layoutDirection === 'rtl' ? 'rotate-180' : ''}`} />
                                        <BreadcrumbItem className="hidden lg:inline-flex">
                                            {crumb.url ? (
                                                <BreadcrumbLink asChild>
                                                    <Link href={crumb.url}>{crumb.label}</Link>
                                                </BreadcrumbLink>
                                            ) : (
                                                <BreadcrumbPage>{crumb.label}</BreadcrumbPage>
                                            )}
                                        </BreadcrumbItem>
                                    </Fragment>
                                ))}

                                {/* Tablet View (md:flex lg:hidden): if > 1 breadcrumbs, show Dashboard -> ... -> Last item */}
                                {breadcrumbs && breadcrumbs.length > 1 && (
                                    <Fragment key="tablet-ellipsis">
                                        <BreadcrumbSeparator className={`hidden md:list-item lg:hidden ${settings.layoutDirection === 'rtl' ? 'rotate-180' : ''}`} />
                                        <BreadcrumbItem className="hidden md:inline-flex lg:hidden">
                                            <BreadcrumbEllipsis className="h-4 w-4" />
                                        </BreadcrumbItem>
                                        <BreadcrumbSeparator className={`hidden md:list-item lg:hidden ${settings.layoutDirection === 'rtl' ? 'rotate-180' : ''}`} />
                                        <BreadcrumbItem className="hidden md:inline-flex lg:hidden">
                                            {breadcrumbs[breadcrumbs.length - 1].url ? (
                                                <BreadcrumbLink asChild>
                                                    <Link href={breadcrumbs[breadcrumbs.length - 1].url ?? '#'}>{breadcrumbs[breadcrumbs.length - 1].label}</Link>
                                                </BreadcrumbLink>
                                            ) : (
                                                <BreadcrumbPage>{breadcrumbs[breadcrumbs.length - 1].label}</BreadcrumbPage>
                                            )}
                                        </BreadcrumbItem>
                                    </Fragment>
                                )}

                                {/* Tablet View (md:flex lg:hidden): if exactly 1 breadcrumb, show Dashboard -> item */}
                                {breadcrumbs && breadcrumbs.length === 1 && (
                                    <Fragment key="tablet-single">
                                        <BreadcrumbSeparator className={`hidden md:list-item lg:hidden ${settings.layoutDirection === 'rtl' ? 'rotate-180' : ''}`} />
                                        <BreadcrumbItem className="hidden md:inline-flex lg:hidden">
                                            {breadcrumbs[0].url ? (
                                                <BreadcrumbLink asChild>
                                                    <Link href={breadcrumbs[0].url}>{breadcrumbs[0].label}</Link>
                                                </BreadcrumbLink>
                                            ) : (
                                                <BreadcrumbPage>{breadcrumbs[0].label}</BreadcrumbPage>
                                            )}
                                        </BreadcrumbItem>
                                    </Fragment>
                                )}
                            </BreadcrumbList>
                        </Breadcrumb>
                    </div>

                    {/* NavUser */}
                    <div
                        className={`flex items-center gap-2`}
                    >
                        {/* Leave Impersonation Button */}
                        {auth.impersonating && (
                            <Button
                                variant="outline"
                                size="sm"
                                onClick={() => router.post(route('users.leave-impersonation'))}
                                className="text-orange-600 border-orange-600 hover:bg-orange-50 dark:hover:bg-orange-500 px-2 sm:px-3"
                            >
                                <UserX className="h-4 w-4 lg:mr-2" />
                                <span className="hidden lg:inline">{t('Leave Login As User')}</span>
                            </Button>
                        )}
                        <NavUser user={auth.user} inHeader={true} />
                    </div>
                </header>

                <main className="px-2.5 sm:px-6 lg:px-8 xl:px-12 pt-2 pb-5 h-full">
                    {pageTitle && (
                        <div className="flex items-center justify-between mb-3 gap-x-4 gap-y-2 sm:mb-4 sm:gap-3" dir={settings.layoutDirection}>
                            <div className="min-w-0">
                                <h1 className="text-lg font-semibold text-foreground break-words sm:text-xl">{pageTitle}</h1>
                                {pageDescription && (
                                    <p className="hidden sm:flex text-sm text-muted-foreground mt-1">{pageDescription}</p>
                                )}
                            </div>
                            <div className="flex flex-wrap items-center gap-2">
                                {backUrl && (
                                    <>
                                        <TooltipProvider>
                                            <Tooltip delayDuration={0}>
                                                <TooltipTrigger asChild>
                                                    <Button size="sm" variant="outline" className="flex items-center gap-2 h-8 px-3 md:hidden" onClick={() => router.visit(backUrl)}>
                                                        <ArrowLeft className="h-4 w-4 rtl:rotate-180" />
                                                    </Button>
                                                </TooltipTrigger>
                                                <TooltipContent>
                                                    <p>{t('Back')}</p>
                                                </TooltipContent>
                                            </Tooltip>
                                        </TooltipProvider>
                                        <Button
                                            variant="outline"
                                            size="sm"
                                            className="flex items-centergap-2 h-8 px-3 hidden md:flex"
                                            onClick={() => router.visit(backUrl)}
                                        >
                                            <ArrowLeft className="h-4 w-4 rtl:rotate-180" />
                                            {t('Back')}
                                        </Button>
                                    </>
                                )}
                                {pageActions}
                            </div>
                        </div>
                    )}
                    {children}
                </main>
            </SidebarInset>
        </SidebarProvider>
        <CookieConsent settings={adminAllSetting || {}} />
        </div>
        </>
    );
}

export default function AuthenticatedLayout({
    children,
    header,
    breadcrumbs,
    pageTitle,
    pageDescription,
    pageActions,
    backUrl,
    className,
    ...props
}: PropsWithChildren<{
    header?: ReactNode;
    breadcrumbs?: Array<{label: string, url?: string}>;
    pageTitle?: string;
    pageDescription?: ReactNode;
    pageActions?: ReactNode;
    backUrl?: string;
    className?: string;
}>) {
    return (
        <BrandProvider>
            <AuthenticatedLayoutContent
                header={header}
                breadcrumbs={breadcrumbs}
                pageTitle={pageTitle}
                pageDescription={pageDescription}
                pageActions={pageActions}
                backUrl={backUrl}
                className={className}
                {...props}
            >
                {children}
            </AuthenticatedLayoutContent>
        </BrandProvider>
    );
}
