import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import {
  fetchSprintParticipants,
  addSprintParticipant,
  updateParticipantCapacity,
  removeSprintParticipant,
  syncSprintParticipants,
  fetchEligibleParticipants,
} from '@/features/projects/services/projectService';
import { capacityPlanningKey } from '@/features/projects/hooks/useSprintTeamCapacity';

export const sprintParticipantsKey = (projectId: string, sprintId: string) =>
  ['projects', projectId, 'sprints', sprintId, 'participants'] as const;

export const eligibleParticipantsKey = (projectId: string, sprintId: string, search?: string) =>
  ['projects', projectId, 'sprints', sprintId, 'eligible-participants', search ?? ''] as const;

export function useSprintParticipants(projectId: string | undefined, sprintId: string | undefined) {
  return useQuery({
    queryKey: sprintParticipantsKey(projectId ?? '', sprintId ?? ''),
    queryFn: () => fetchSprintParticipants(projectId!, sprintId!),
    enabled: Boolean(projectId && sprintId),
  });
}

export function useEligibleParticipants(
  projectId: string | undefined,
  sprintId: string | undefined,
  search?: string,
) {
  return useQuery({
    queryKey: eligibleParticipantsKey(projectId ?? '', sprintId ?? '', search),
    queryFn: () => fetchEligibleParticipants(projectId!, sprintId!, search),
    enabled: Boolean(projectId && sprintId),
  });
}

export function useAddParticipant(projectId: string, sprintId: string) {
  const qc = useQueryClient();

  return useMutation({
    mutationFn: ({ userId, capacityMd }: { userId: string; capacityMd?: number | null }) =>
      addSprintParticipant(projectId, sprintId, userId, capacityMd),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: sprintParticipantsKey(projectId, sprintId) });
      qc.invalidateQueries({ queryKey: eligibleParticipantsKey(projectId, sprintId) });
      qc.invalidateQueries({ queryKey: capacityPlanningKey(projectId, sprintId) });
    },
  });
}

export function useUpdateParticipantCapacity(projectId: string, sprintId: string) {
  const qc = useQueryClient();

  return useMutation({
    mutationFn: ({ userId, capacityMd }: { userId: string; capacityMd: number | null }) =>
      updateParticipantCapacity(projectId, sprintId, userId, capacityMd),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: sprintParticipantsKey(projectId, sprintId) });
      qc.invalidateQueries({ queryKey: capacityPlanningKey(projectId, sprintId) });
    },
  });
}

export function useRemoveParticipant(projectId: string, sprintId: string) {
  const qc = useQueryClient();

  return useMutation({
    mutationFn: (userId: string) => removeSprintParticipant(projectId, sprintId, userId),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: sprintParticipantsKey(projectId, sprintId) });
      qc.invalidateQueries({ queryKey: eligibleParticipantsKey(projectId, sprintId) });
      qc.invalidateQueries({ queryKey: capacityPlanningKey(projectId, sprintId) });
    },
  });
}

export function useSyncParticipants(projectId: string, sprintId: string) {
  const qc = useQueryClient();

  return useMutation({
    mutationFn: (participants: Array<{ user_id: string; capacity_md?: number | null }>) =>
      syncSprintParticipants(projectId, sprintId, participants),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: sprintParticipantsKey(projectId, sprintId) });
      qc.invalidateQueries({ queryKey: eligibleParticipantsKey(projectId, sprintId) });
      qc.invalidateQueries({ queryKey: capacityPlanningKey(projectId, sprintId) });
    },
  });
}
