'use client';

import { useQuery } from '@tanstack/react-query';
import { useQueryClient } from '@tanstack/react-query';
import { useCallback } from 'react';

import { SONGIFY_CONFIG } from '@/config/songify';
import { useApiClient } from '@/lib/apiClient';
import {
  SongifyGetVideosByUserResponse,
  SongifyProject,
  SongifyProjectStatus,
  SongifyStatusData,
} from '@/types/songify';

import { groupBackendVideosToProjects } from './adapters';
import { songifyKeys } from './keys';

export function useSongifyProjects() {
  const apiClient = useApiClient();
  const queryClient = useQueryClient();

  // Fetch projects from backend
  const projectsQuery = useQuery({
    queryKey: songifyKeys.projects(),
    queryFn: async () => {
      const { data, error } = await apiClient.GET(
        '/api/songify/get-videos-by-user',
        {
          params: { query: { order: 'oldest' } },
        }
      );

      if (error || !data) {
        throw new Error('Failed to fetch projects from backend');
      }

      const response = data as SongifyGetVideosByUserResponse;
      return groupBackendVideosToProjects(response.videos);
    },
    staleTime: 5 * 60 * 1000, // 5 minutes
    gcTime: 5 * 60 * 1000, // 5 minutes
  });

  // Handle status updates from polling - update cache directly
  const handleStatusUpdate = useCallback(
    (requestId: string, statusData: SongifyStatusData) => {
      const currentProjects = queryClient.getQueryData<SongifyProject[]>(
        songifyKeys.projects()
      );

      if (!currentProjects) {
        console.warn('Cannot update status: projects not loaded yet');
        return;
      }

      const updatedProjects = currentProjects.map((project) =>
        project.requestId === requestId
          ? {
              ...project,
              status: statusData.status as SongifyProjectStatus,
              statusDetails: statusData,
            }
          : project
      );

      queryClient.setQueryData(songifyKeys.projects(), updatedProjects);
    },
    [queryClient]
  );

  // Check if a project is stale (older than 15 minutes)
  const isProjectStale = useCallback(
    (requestId: string) => {
      const currentProjects = projectsQuery.data || [];
      const project = currentProjects.find(
        (p: SongifyProject) => p.requestId === requestId
      );
      if (!project) return true;

      const creationTime = new Date(project.createdAt);
      const fifteenMinutesAgo = new Date(
        Date.now() - SONGIFY_CONFIG.STALE_PROJECT_TIMEOUT
      );
      return creationTime < fifteenMinutesAgo;
    },
    [projectsQuery.data]
  );

  // Generate incremented project name for regeneration
  const getIncrementedProjectName = useCallback((name: string) => {
    const match = name?.match(/^(.*?)(?:\s*(\d+))?$/);
    if (!match) return `${name} 2`;
    const base = (match[1] || '').trim();
    const num = match[2] ? parseInt(match[2], 10) : null;
    return num ? `${base} ${num + 1}` : `${name} 2`;
  }, []);

  return {
    projects: projectsQuery.data || [],
    isLoading: projectsQuery.isLoading,
    error: projectsQuery.error,

    // Actions
    handleStatusUpdate,

    // Utilities
    isProjectStale,
    getIncrementedProjectName,

    // Query controls
    refetch: projectsQuery.refetch,
  };
}
