import { toast } from 'sonner';

import { useCallback, useState } from 'react';

import { router } from '@inertiajs/react';

const STORAGE_PREFIX = 'rankwiz_milestone_';

export type MilestoneKey =
  | 'first_analysis_complete'
  | 'first_recommendation_applied'
  | 'first_draft_generated'
  | 'first_draft_published'
  | 'first_recommendations_viewed'
  | 'recommendations_tour_completed'
  | 'gsc_connected'
  | 'wp_connected'
  | 'setup_complete';

interface UseMilestoneReturn {
  celebrate: (message: string, description?: string) => void;
  hasCelebrated: boolean;
}

/**
 * Hook for one-time celebration toasts with localStorage + server-side dedup.
 * Each milestone key fires at most once per browser (localStorage) and is
 * also persisted server-side via POST /api/settings for cross-device dedup.
 * ACT-012: server-backed milestones.
 */
export function useMilestone(key: MilestoneKey): UseMilestoneReturn {
  const storageKey = `${STORAGE_PREFIX}${key}`;

  const [hasCelebrated] = useState(() => {
    if (typeof window === 'undefined') return false;
    return localStorage.getItem(storageKey) === 'true';
  });

  const celebrate = useCallback(
    (message: string, description?: string) => {
      if (typeof window === 'undefined') return;
      if (localStorage.getItem(storageKey) === 'true') return;

      localStorage.setItem(storageKey, 'true');

      // ACT-012: Persist to server for cross-device dedup (fire-and-forget)
      try {
        router.post(
          '/api/settings',
          { key: `milestone_${key}_celebrated`, value: 'true' },
          { preserveState: true, preserveScroll: true },
        );
      } catch {
        // Server persistence is best-effort; localStorage dedup is the primary guard
      }

      toast.success(message, {
        description,
        duration: 5000,
      });
    },
    [storageKey, key],
  );

  return { celebrate, hasCelebrated };
}
