import { useMemo } from 'react';
import { useQueries, useQuery } from '@tanstack/react-query';
import {
  fetchPortfolioGantt,
  fetchProjectGantt,
} from '@/features/projects/services/projectService';
import type { ProjectGanttTimeline } from '@/features/projects/types/project.types';

export function useProjectGantt(projectId: string | undefined) {
  return useQuery({
    queryKey: ['projects', projectId, 'gantt'],
    queryFn: () => fetchProjectGantt(projectId!),
    enabled: Boolean(projectId),
  });
}

export function usePortfolioGantt(params: {
  range: 'year' | 'quarter' | 'month';
  year: number;
  quarter?: number;
  month?: number;
  status?: string;
  department_id?: string;
  owner_user_ids?: string[];
  health_filter?: 'healthy' | 'at_risk' | 'critical';
  search?: string;
  active_only?: boolean;
  delayed_only?: boolean;
  blocked_only?: boolean;
  at_risk_only?: boolean;
}) {
  return useQuery({
    queryKey: ['portfolio', 'gantt', params],
    queryFn: () => fetchPortfolioGantt(params),
  });
}

function projectHasScheduleData(data: ProjectGanttTimeline | undefined): boolean {
  if (!data) return false;
  return data.timeline.some((item) => item.entity_type !== 'project');
}

export function usePortfolioDetailedGantt(projectIds: string[]) {
  const queries = useQueries({
    queries: projectIds.map((projectId) => ({
      queryKey: ['projects', projectId, 'gantt'],
      queryFn: () => fetchProjectGantt(projectId),
      enabled: Boolean(projectId),
    })),
  });

  const isLoading = queries.some((query) => query.isLoading);
  const isError = queries.some((query) => query.isError);
  const hasScheduleData = useMemo(
    () => queries.some((query) => projectHasScheduleData(query.data)),
    [queries],
  );

  return { queries, isLoading, isError, hasScheduleData };
}
