import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useAuthStore } from '@/features/auth/store/authStore';
import { onboardingService } from '@/features/onboarding/services/onboardingService';
import type { OnboardingStatus } from '@/features/onboarding/types/onboarding.types';

export const ONBOARDING_QUERY_KEY = ['onboarding', 'status'] as const;

export function useOnboarding() {
  const queryClient = useQueryClient();
  const updateUser = useAuthStore((state) => state.updateUser);
  const isAuthenticated = useAuthStore((state) => state.isAuthenticated);

  const statusQuery = useQuery({
    queryKey: ONBOARDING_QUERY_KEY,
    queryFn: () => onboardingService.getStatus(),
    enabled: isAuthenticated,
    staleTime: 30_000,
  });

  const invalidate = () => {
    void queryClient.invalidateQueries({ queryKey: ONBOARDING_QUERY_KEY });
  };

  const updateStepMutation = useMutation({
    mutationFn: (step: string) => onboardingService.updateStep(step),
    onSuccess: (data) => {
      updateUser({
        onboarding_step: data.onboarding_step ?? undefined,
        onboarding_completed_at: data.onboarding_completed_at ?? undefined,
      });
      invalidate();
    },
  });

  const completeMutation = useMutation({
    mutationFn: () => onboardingService.complete(),
    onSuccess: (data) => {
      updateUser({
        onboarding_step: null,
        onboarding_completed_at: data.onboarding_completed_at ?? undefined,
      });
      invalidate();
    },
  });

  const dismissTourMutation = useMutation({
    mutationFn: (tourId: string) => onboardingService.dismissTour(tourId),
    onSuccess: (data) => {
      updateUser({ dismissed_tours: data.dismissed_tours });
      invalidate();
    },
  });

  const status: OnboardingStatus | undefined = statusQuery.data;

  return {
    status,
    isLoading: statusQuery.isLoading,
    isError: statusQuery.isError,
    refetch: statusQuery.refetch,
    shouldShowWizard: Boolean(status?.should_show_wizard),
    persona: status?.persona,
    currentStep: status?.onboarding_step,
    dismissedTours: status?.dismissed_tours ?? [],
    checklist: status?.checklist,
    departmentId: status?.department_id,
    updateStep: updateStepMutation.mutateAsync,
    complete: completeMutation.mutateAsync,
    dismissTour: dismissTourMutation.mutateAsync,
    isUpdating: updateStepMutation.isPending || completeMutation.isPending,
  };
}
