import { createContext, useContext, useState, useCallback, type ReactNode } from 'react';
import { FileBrowserDialog } from '@/components/dialogs/file-browser-dialog';

interface FileBrowserOptions {
  title?: string;
  description?: string;
  initialPath?: string;
}

interface FileBrowserContextValue {
  openFileBrowser: (options?: FileBrowserOptions) => Promise<string | null>;
}

const FileBrowserContext = createContext<FileBrowserContextValue | null>(null);

export function FileBrowserProvider({ children }: { children: ReactNode }) {
  const [isOpen, setIsOpen] = useState(false);
  const [resolver, setResolver] = useState<((value: string | null) => void) | null>(null);
  const [dialogOptions, setDialogOptions] = useState<FileBrowserOptions>({});

  const openFileBrowser = useCallback((options?: FileBrowserOptions): Promise<string | null> => {
    return new Promise((resolve) => {
      setDialogOptions(options || {});
      setIsOpen(true);
      setResolver(() => resolve);
    });
  }, []);

  const handleSelect = useCallback(
    (path: string) => {
      if (resolver) {
        resolver(path);
        setResolver(null);
      }
      setIsOpen(false);
      setDialogOptions({});
    },
    [resolver]
  );

  const handleOpenChange = useCallback(
    (open: boolean) => {
      if (!open && resolver) {
        resolver(null);
        setResolver(null);
      }
      setIsOpen(open);
      if (!open) {
        setDialogOptions({});
      }
    },
    [resolver]
  );

  return (
    <FileBrowserContext.Provider value={{ openFileBrowser }}>
      {children}
      <FileBrowserDialog
        open={isOpen}
        onOpenChange={handleOpenChange}
        onSelect={handleSelect}
        title={dialogOptions.title}
        description={dialogOptions.description}
        initialPath={dialogOptions.initialPath}
      />
    </FileBrowserContext.Provider>
  );
}

export function useFileBrowser() {
  const context = useContext(FileBrowserContext);
  if (!context) {
    throw new Error('useFileBrowser must be used within FileBrowserProvider');
  }
  return context;
}

// Global reference for non-React code (like HttpApiClient)
let globalFileBrowserFn: ((options?: FileBrowserOptions) => Promise<string | null>) | null = null;

export function setGlobalFileBrowser(fn: (options?: FileBrowserOptions) => Promise<string | null>) {
  globalFileBrowserFn = fn;
}

export function getGlobalFileBrowser() {
  return globalFileBrowserFn;
}

// Export the options type for consumers
export type { FileBrowserOptions };
