import { useAppSelector, useAppDispatch } from "./useRedux";
import {
  loginUser,
  logoutUser,
  clearAuth,
  setUser,
} from "@/store/slices/authSlice";
import {
  fetchSubscription,
  clearSubscription,
} from "@/store/slices/subscriptionSlice";
import { clearPayments } from "@/store/slices/paymentSlice";
import type { LoginPayload } from "@/types";
import { ROUTES } from "@/constants";
import { useRouter } from "next/navigation";
import toast from "react-hot-toast";
import { clearSessionFlowState, isSessionFlow } from "@/utils/sessionFlow";

export function useAuth() {
  const dispatch = useAppDispatch();
  const router = useRouter();
  const { user, isAuthenticated, isLoading, error } = useAppSelector(
    (s) => s.auth,
  );
  const subscription = useAppSelector((s) => s.subscription.subscription);

  const login = async (payload: LoginPayload) => {
    const result = await dispatch(loginUser(payload));

    if (loginUser.fulfilled.match(result)) {
      toast.success("Welcome back!");

      const subResult = await dispatch(fetchSubscription());
      if (
        fetchSubscription.fulfilled.match(subResult) &&
        (subResult.payload?.status === "active" ||
          subResult.payload?.status === "trialing")
      ) {
        router.push(isSessionFlow() ? ROUTES.MOBILE_ACCOUNT : ROUTES.DASHBOARD);
      } else {
        router.push(isSessionFlow() ? ROUTES.MOBILE_ACCOUNT : ROUTES.PRICING);
      }
      return true;
    }
    return false;
  };

  const logout = async () => {
    await dispatch(logoutUser());
    dispatch(clearAuth());
    dispatch(clearSubscription());
    dispatch(clearPayments());
    clearSessionFlowState();
    toast.success("Logged out successfully");
    router.push(ROUTES.LOGIN);
  };

  const hasActivePlan =
    subscription?.status === "active" || subscription?.status === "trialing";

  const isTrialing = subscription?.status === "trialing";
  const isRestricted =
    !subscription ||
    subscription.status === "none" ||
    subscription.status === "trial_expired" ||
    subscription.status === "expired" ||
    (subscription.status === "cancelled" &&
      subscription.current_period_end &&
      new Date(subscription.current_period_end) < new Date());

  return {
    user,
    isAuthenticated,
    isLoading,
    error,
    subscription,
    hasActivePlan,
    isTrialing,
    isRestricted,
    login,
    logout,
  };
}
