import DashboardController from "@/actions/App/Http/Controllers/Dashboard/IndexController";
import { useTheme } from "@/hooks/use-theme";
import { logout } from "@/routes";
import { SharedData } from "@/types";
import { Link, router, usePage } from "@inertiajs/react";
import clsx from "clsx";
import { Fragment, useEffect, useState } from "react";
import {
    Button,
    Form,
    Image,
    InputGroup,
    NavDropdown,
    OverlayTrigger,
    Tooltip,
} from "react-bootstrap";
import { BiExitFullscreen, BiFullscreen, BiMoon, BiSun } from "react-icons/bi";
import { MdLogout, MdMenu, MdPersonOutline, MdSearch } from "react-icons/md";

interface AppHeaderProps {
    setIsSidebarMobileOpen: (open: boolean) => void;
}

const iconSize: number = 20;

export default function AppHeaderLayout({
    setIsSidebarMobileOpen,
}: AppHeaderProps) {
    const { auth } = usePage<SharedData>().props;
    const { url } = usePage();
    const user = auth.user;
    const { isDarkMode, toggleTheme } = useTheme();
    const [sidebarSize, setSidebarSize] = useState("lg");
    const [mobileView, setMobileView] = useState<boolean>(false);
    const [isFullscreen, setIsFullscreen] = useState<boolean>(false);
    const [noResi, setNoResi] = useState("");

    useEffect(() => {
        // Initialize
        setSidebarSize(
            document.documentElement.getAttribute("data-sidebar-size") ?? "lg",
        );
        setMobileView(
            document.documentElement.getAttribute("data-mobile-view") ===
                "true",
        );

        // Check initial fullscreen state
        setIsFullscreen(!!document.fullscreenElement);

        // Listen for fullscreen changes
        const handleFullscreenChange = () => {
            setIsFullscreen(!!document.fullscreenElement);
        };

        document.addEventListener("fullscreenchange", handleFullscreenChange);

        // MutationObserver to watch attribute changes on <html>
        const observer = new MutationObserver((mutations) => {
            for (const mutation of mutations) {
                if (
                    mutation.type === "attributes" &&
                    mutation.attributeName === "data-sidebar-size"
                ) {
                    setSidebarSize(
                        document.documentElement.getAttribute(
                            "data-sidebar-size",
                        ) ?? "lg",
                    );
                }
                if (
                    mutation.type === "attributes" &&
                    mutation.attributeName === "data-mobile-view"
                ) {
                    setMobileView(
                        document.documentElement.getAttribute(
                            "data-mobile-view",
                        ) === "true",
                    );
                }
            }
        });

        observer.observe(document.documentElement, {
            attributes: true,
            attributeFilter: ["data-sidebar-size", "data-mobile-view"],
        });

        // Fallback: listen for a custom event if your app emits one when toggling sidebar
        const onSidebarSizeChanged = (e: any) => {
            const val =
                e?.detail?.value ||
                document.documentElement.getAttribute("data-sidebar-size");
            setSidebarSize(val ?? "lg");
        };
        window.addEventListener(
            "sidebar-size-changed",
            onSidebarSizeChanged as EventListener,
        );

        const onMobileViewChanged = (e: any) => {
            const val =
                e?.detail?.value ||
                document.documentElement.getAttribute("data-mobile-view");
            setMobileView(val === "true");
        };
        window.addEventListener(
            "mobile-view-changed",
            onMobileViewChanged as EventListener,
        );

        return () => {
            observer.disconnect();
            document.removeEventListener(
                "fullscreenchange",
                handleFullscreenChange,
            );
            window.removeEventListener(
                "sidebar-size-changed",
                onSidebarSizeChanged as EventListener,
            );
            window.removeEventListener(
                "mobile-view-changed",
                onMobileViewChanged as EventListener,
            );
        };
    }, []);

    const toggleFullscreen = async () => {
        try {
            if (!document.fullscreenElement) {
                // Enter fullscreen
                await document.documentElement.requestFullscreen();
            } else {
                // Exit fullscreen
                await document.exitFullscreen();
            }
        } catch (error) {
            console.error("Error toggling fullscreen:", error);
        }
    };

    return (
        <header className="app-header">
            <div className="app-header-container">
                <div className="d-flex align-items-center gap-2">
                    {mobileView ? (
                        <Fragment>
                            <Button
                                variant="link"
                                size="sm"
                                className="text-primary"
                                onClick={() => setIsSidebarMobileOpen(true)}
                            >
                                <MdMenu size={iconSize} />
                            </Button>
                            <h5
                                className="mb-0 d-flex align-items-center gap-2 cursor-pointer"
                                onClick={() => DashboardController.index.url()}
                            >
                                <div className="flex-shrink-0">
                                    <Image
                                        src="/assets/logo_pemkot.png"
                                        className="object-fit-contain"
                                        style={{ width: 50, height: 50 }}
                                    />
                                </div>
                                <div className="flex-grow-1">
                                    <div className="mb-1 fw-bold">SIAB</div>
                                    <div
                                        className="text-muted"
                                        style={{ fontSize: "0.65rem" }}
                                    >
                                        Absensi Paruh Waktu
                                    </div>
                                </div>
                            </h5>
                        </Fragment>
                    ) : null}
                </div>

                <div className="d-flex align-items-center gap-2">
                    <div>
                        <OverlayTrigger
                            placement="bottom"
                            overlay={
                                <Tooltip>
                                    {isDarkMode ? "Light" : "Dark"}
                                </Tooltip>
                            }
                        >
                            <Button
                                size="sm"
                                variant="link"
                                className="text-secondary-emphasis"
                                onClick={toggleTheme}
                            >
                                {isDarkMode ? (
                                    <BiSun size={iconSize} />
                                ) : (
                                    <BiMoon size={iconSize} />
                                )}
                            </Button>
                        </OverlayTrigger>
                    </div>
                    {!mobileView && (
                        <div>
                            <OverlayTrigger
                                placement="bottom"
                                overlay={
                                    <Tooltip>
                                        {isFullscreen
                                            ? "Exit Fullscreen"
                                            : "Fullscreen"}
                                    </Tooltip>
                                }
                            >
                                <Button
                                    size="sm"
                                    variant="link"
                                    className="text-secondary-emphasis"
                                    onClick={toggleFullscreen}
                                >
                                    {isFullscreen ? (
                                        <BiExitFullscreen size={iconSize} />
                                    ) : (
                                        <BiFullscreen size={iconSize} />
                                    )}
                                </Button>
                            </OverlayTrigger>
                        </div>
                    )}
                    <div className="ms-md-2">
                        <NavDropdown
                            title={
                                mobileView ? (
                                    <MdPersonOutline
                                        className="text-secondary-emphasis"
                                        size={iconSize}
                                    />
                                ) : (
                                    <div className="d-flex align-items-center gap-2 text-secondary-emphasis">
                                        <MdPersonOutline size={iconSize} />
                                        <span>{user.name}</span>
                                    </div>
                                )
                            }
                            id="basic-nav-dropdown"
                            align="end"
                            className="no-caret"
                        >
                            <NavDropdown.Item href="#action/3.1">
                                Profile Saya
                            </NavDropdown.Item>
                            <NavDropdown.Divider />
                            <NavDropdown.Item
                                onClick={() => router.post(route("logout"))}
                                as="button"
                            >
                                <MdLogout />
                                <span>Logout</span>
                            </NavDropdown.Item>
                        </NavDropdown>
                    </div>
                </div>
            </div>
        </header>
    );
}
