"use client";

import { useState, useEffect } from "react";
import { getUserDataCookie, setUserDataCookie, logout } from "@/lib/cookies";
import { usePathname, useRouter } from "@/i18n/navigation";
import DashboardHeaderWrapper from "@/components/practice-manager/DashboardHeaderWrapper";
import EditProfileModal from "@/components/practitioner/modals/EditProfileModal";
import ChangePasswordModal from "@/components/practitioner/modals/ChangePasswordModal";
import SupportModal from "@/components/practitioner/modals/SupportModal";
import { useLoginControllerLogoutV1 } from "@/api/user/user-authentication/user-authentication";
import { useSubscriptionControllerGetBillingHistoryV1 } from "@/api/user/practitioner-subscription/practitioner-subscription";

export default function PracticeManagerLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  const pathname = usePathname();
  const router = useRouter();
  const [editProfileOpen, setEditProfileOpen] = useState(false);
  const [changePasswordOpen, setChangePasswordOpen] = useState(false);
  const [supportOpen, setSupportOpen] = useState(false);
  const [isForceChange, setIsForceChange] = useState(false);

  // Client-side auth guard: redirect to login if no session
  useEffect(() => {
    const data = getUserDataCookie();
    if (!data) {
      router.replace('/login');
    }
  }, [router]);

  // Check subscription status from cookie
  const [userData, setUserData] = useState<ReturnType<typeof getUserDataCookie>>(null);
  useEffect(() => {
    const data = getUserDataCookie();
    setUserData(data);
    // Auto-open change password modal for invited users
    if (data?.force_password_change) {
      setChangePasswordOpen(true);
      setIsForceChange(true);
    }
  }, []);

  // Fetch billing history as fallback check for subscription status
  const { data: billingData, isLoading: isLoadingBilling, isError: isBillingError } = useSubscriptionControllerGetBillingHistoryV1({
    query: { retry: false, refetchOnWindowFocus: false },
  });
  const hasBillingHistory = !isLoadingBilling && !isBillingError && (billingData?.data || []).length > 0;

  // Update cookie when billing history confirms subscription
  useEffect(() => {
    if (hasBillingHistory && userData && !userData.has_active_subscription) {
      const updated = { ...userData, has_active_subscription: true };
      setUserDataCookie(updated);
      setUserData(updated);
    }
  }, [hasBillingHistory, userData]);

  const isOnSubscriptionPage = pathname.startsWith('/practice-manager/subscription');
  // Bibliography is publicly accessible — never redirect even for unsubscribed users.
  const isOnPublicPage = pathname.startsWith('/practice-manager/bibliography');

  // Combined check: cookie OR billing history
  const isSubscribed = !!userData?.has_active_subscription || hasBillingHistory;

  useEffect(() => {
    // Don't redirect while data is loading, on subscription/public pages, or if billing API errored
    if (!userData || isOnSubscriptionPage || isOnPublicPage || isLoadingBilling || isBillingError) return;
    if (!isSubscribed) {
      router.replace('/practice-manager/subscription');
    }
  }, [userData, isOnSubscriptionPage, isOnPublicPage, router, isSubscribed, isLoadingBilling, isBillingError]);

  const logoutMutation = useLoginControllerLogoutV1({
    mutation: {
      onSuccess: () => {
        logout();
      },
      onError: () => {
        logout();
      },
    },
  });

  const handleLogout = () => {
    logoutMutation.mutate();
  };

  const handlePasswordChanged = () => {
    setChangePasswordOpen(false);
    setIsForceChange(false);
    const data = getUserDataCookie();
    if (data) {
      const updated = { ...data, force_password_change: false };
      setUserDataCookie(updated);
      setUserData(updated);
    }
  };

  // Show spinner while billing check is pending for unsubscribed users to prevent dashboard flash
  const isCheckingSubscription = isLoadingBilling && !userData?.has_active_subscription && !isOnSubscriptionPage && !isOnPublicPage;

  return (
    <div className="min-h-screen bg-gradient-to-br from-[#E8F4F8] via-[#EEF6F9] to-[#E5EEF2]">
      <DashboardHeaderWrapper
        onEditProfile={() => setEditProfileOpen(true)}
        onChangePassword={() => setChangePasswordOpen(true)}
        onSupport={() => setSupportOpen(true)}
        onLogout={handleLogout}
        hasActiveSubscription={isSubscribed}
      />
      {isCheckingSubscription ? (
        <div className="flex items-center justify-center min-h-[80vh]">
          <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-[#3B9EC9]" />
        </div>
      ) : children}
      <EditProfileModal
        isOpen={editProfileOpen}
        onClose={() => setEditProfileOpen(false)}
      />
      <ChangePasswordModal
        isOpen={changePasswordOpen}
        onClose={() => {
          if (!isForceChange) {
            setChangePasswordOpen(false);
          }
        }}
        forceChange={isForceChange}
        onPasswordChanged={handlePasswordChanged}
      />
      <SupportModal
        isOpen={supportOpen}
        onClose={() => setSupportOpen(false)}
      />
    </div>
  );
}
