import { useCallback, useEffect, useState } from 'react';

const SEEN_KEY = 'rankwiz_changelog_seen_at';
const LATEST_KEY = 'rankwiz_changelog_latest_at';
// Fired by DashboardLayout when LATEST_KEY is seeded/updated (server knows about new entries)
const LATEST_UPDATED_EVENT = 'changelog-latest-updated';
// Fired by markSeen when the user actually visits /changelog
const VISITED_EVENT = 'changelog-visited';

function computeHasNew(): boolean {
  try {
    const seenAt = localStorage.getItem(SEEN_KEY);
    const latestAt = localStorage.getItem(LATEST_KEY);
    // Never visited: show badge if there are known entries
    if (!seenAt) return !!latestAt;
    // Visited before: show badge if latest entry is newer than last visit
    return !!latestAt && latestAt > seenAt;
  } catch {
    return false;
  }
}

/**
 * Tracks whether the user has unread changelog entries.
 *
 * - `hasNew` — true when unread entries exist (drives the nav badge)
 * - `markSeen(latestAt)` — call on Changelog page mount to record the visit
 *   and update the known latest entry date
 */
export function useChangelogBadge(latestEntryAt?: string) {
  const [hasNew, setHasNew] = useState<boolean>(() => computeHasNew());

  // Re-compute badge when either:
  // - LATEST_KEY was updated by DashboardLayout seeding (new entries available → badge may appear)
  // - User visited /changelog and markSeen fired (badge should clear)
  useEffect(() => {
    const handler = () => setHasNew(computeHasNew());
    window.addEventListener(LATEST_UPDATED_EVENT, handler);
    window.addEventListener(VISITED_EVENT, handler);
    return () => {
      window.removeEventListener(LATEST_UPDATED_EVENT, handler);
      window.removeEventListener(VISITED_EVENT, handler);
    };
  }, []);

  const markSeen = useCallback(
    (entryAt?: string) => {
      try {
        const at = entryAt ?? latestEntryAt;
        if (at) {
          localStorage.setItem(LATEST_KEY, at);
        }
        localStorage.setItem(SEEN_KEY, new Date().toISOString());
        setHasNew(false);
        window.dispatchEvent(new Event(VISITED_EVENT));
      } catch {
        // localStorage unavailable (private browsing, quota exceeded, etc.) — ignore
      }
    },
    [latestEntryAt],
  );

  return { hasNew, markSeen };
}
