"use client";

import { useEffect, useState } from "react";
import { useRouter } from "next/navigation";
import {
  getPermissionLevel,
  getBlockReason,
  getPremiumBlockReason,
  setPremiumStatus,
  type PermissionLevel,
} from "@/lib/utils/permissions";
import { getStoredUser } from "@/lib/utils/persistAuth";
import { useToast } from "@/lib/toast";

export function usePermission() {
  const router = useRouter();
  const { error: showError } = useToast();
  const [level, setLevel] = useState<PermissionLevel>("guest");
  const [userId, setUserId] = useState(0);

  useEffect(() => {
    const user = getStoredUser();
    setUserId(user?.id ?? 0);
    setLevel(getPermissionLevel());
  }, []);

  const isGuest   = level === "guest";
  const isLoggedIn = level !== "guest";
  const isPremium  = level === "premium";

  /**
   * Guard for social actions (like, comment, follow, report, poll).
   * Returns `false` and shows a toast + redirects if blocked.
   */
  function requireLogin(action: string): boolean {
    const block = getBlockReason(action, level);
    if (block) {
      showError(block.message);
      router.push(block.redirect);
      return false;
    }
    return true;
  }

  /**
   * Guard for premium content (e-paper, paid articles).
   * Returns `false` and redirects if blocked.
   */
  function requirePremium(): boolean {
    const block = getPremiumBlockReason(level);
    if (block) {
      showError(block.message);
      router.push(block.redirect);
      return false;
    }
    return true;
  }

  /** Call after a successful subscription to unlock premium features */
  function unlockPremium() {
    setPremiumStatus(true);
    setLevel("premium");
  }

  return { level, userId, isGuest, isLoggedIn, isPremium, requireLogin, requirePremium, unlockPremium };
}
