'use client';

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

import { FileGrid } from '@/components/files/file-grid';
import { FileUploadZone } from '@/components/files/file-upload-zone';
import { FilePreviewDialog } from '@/components/files/file-preview-dialog';
import { PermissionGate } from '@/components/shared/permission-gate';
import { usePaginatedQuery } from '@/hooks/use-paginated-query';
import { useRealtimeInvalidation } from '@/hooks/use-realtime-invalidation';
import { apiFetch } from '@/lib/api/client';
import type { FileRow } from '@/components/files/file-grid';

interface ClientFilesTabProps {
  clientId: string;
}

export function ClientFilesTab({ clientId }: ClientFilesTabProps) {
  const queryClient = useQueryClient();
  const [previewFile, setPreviewFile] = useState<FileRow | null>(null);

  const { data, isLoading } = usePaginatedQuery<FileRow>({
    queryKey: ['files', { clientId }],
    endpoint: `/api/v1/files?clientId=${encodeURIComponent(clientId)}`,
    filterDefinitions: [],
  });

  useRealtimeInvalidation({
    'file:uploaded': [['files', { clientId }]],
    'file:updated': [['files', { clientId }]],
    'file:deleted': [['files', { clientId }]],
  });

  const handleDownload = async (file: FileRow) => {
    try {
      const res = await apiFetch<{ data: { url: string; filename: string } }>(
        `/api/v1/files/${file.id}/download`,
      );
      const a = document.createElement('a');
      a.href = res.data.url;
      a.download = res.data.filename;
      a.click();
    } catch {
      // silent
    }
  };

  const handleDelete = async (file: FileRow) => {
    if (!confirm(`Delete "${file.filename}"? This cannot be undone.`)) return;
    try {
      await apiFetch(`/api/v1/files/${file.id}`, { method: 'DELETE' });
      queryClient.invalidateQueries({ queryKey: ['files', { clientId }] });
    } catch {
      // silent
    }
  };

  return (
    <div className="space-y-4">
      <PermissionGate resource="files" action="upload">
        <FileUploadZone
          clientId={clientId}
          onUploadComplete={() => {
            queryClient.invalidateQueries({ queryKey: ['files', { clientId }] });
          }}
        />
      </PermissionGate>

      <FileGrid
        files={data}
        onDownload={handleDownload}
        onPreview={setPreviewFile}
        onRename={() => {}}
        onDelete={handleDelete}
        isLoading={isLoading}
      />

      <FilePreviewDialog
        open={!!previewFile}
        onOpenChange={(open) => !open && setPreviewFile(null)}
        fileId={previewFile?.id}
        fileName={previewFile?.filename}
        mimeType={previewFile?.mimeType ?? undefined}
      />
    </div>
  );
}
