import { Button } from '@learnitive/ui-components';
import { Sparkles } from 'lucide-react';
import React from 'react';
import { AiChatOverlay } from './ai-chat-overlay';
import type { AiConversationTab } from './ai-conversation-shell';
import type { PaperMemoryManuscriptActionRequest, PaperMemoryManuscriptSelection, PaperMemoryOpenPaperRequest } from '../paper-memory-manuscript';

type AiChatShellProps = {
  wsName: string;
  manuscriptSelection?: PaperMemoryManuscriptSelection;
  paperMemoryActionRequest?: PaperMemoryManuscriptActionRequest;
  tabRequest?: { id: number; tab: AiConversationTab };
  paperOpenRequest?: PaperMemoryOpenPaperRequest;
  agentRequest?: { id: number; text: string };
  assistantInputRequest?: { id: number; text: string };
  onAgentRequestConsumed?: (id: number) => void;
  open?: boolean;
  onOpenChange?: (open: boolean) => void;
  showLauncher?: boolean;
  papersEnabled?: boolean;
  latexAiActions?: boolean;
};

export function AiChatShell({
  wsName,
  manuscriptSelection,
  paperMemoryActionRequest,
  tabRequest,
  paperOpenRequest,
  agentRequest,
  assistantInputRequest,
  onAgentRequestConsumed,
  open: controlledOpen,
  onOpenChange,
  showLauncher = true,
  papersEnabled = true,
  latexAiActions = true,
}: AiChatShellProps) {
  const [internalOpen, setInternalOpen] = React.useState(false);
  const open = controlledOpen ?? internalOpen;
  const openRef = React.useRef(open);
  const controlledOpenRef = React.useRef(controlledOpen);
  openRef.current = open;
  controlledOpenRef.current = controlledOpen;
  const setOpen = React.useCallback<React.Dispatch<React.SetStateAction<boolean>>>((next) => {
    const value = typeof next === 'function' ? next(openRef.current) : next;
    openRef.current = value;
    if (controlledOpenRef.current === undefined) setInternalOpen(value);
    onOpenChange?.(value);
  }, [onOpenChange]);

  React.useEffect(() => {
    setOpen(false);
  }, [setOpen, wsName]);

  React.useEffect(() => {
    if (paperMemoryActionRequest || assistantInputRequest) setOpen(true);
  }, [assistantInputRequest?.id, paperMemoryActionRequest?.id, setOpen]);

  if (!open && !showLauncher) return null;

  return (
    <div
      className="pointer-events-none fixed inset-0 z-[70]"
      data-testid="interactive-ai-shell"
    >
      {open && (
        <AiChatOverlay
          wsName={wsName}
          onClose={() => setOpen(false)}
          manuscriptSelection={manuscriptSelection}
          paperMemoryActionRequest={paperMemoryActionRequest}
          tabRequest={tabRequest}
          paperOpenRequest={paperOpenRequest}
          agentRequest={agentRequest}
          assistantInputRequest={assistantInputRequest}
          onAgentRequestConsumed={onAgentRequestConsumed}
          papersEnabled={papersEnabled}
          latexAiActions={latexAiActions}
        />
      )}
      {showLauncher && (
        <Button
          className="pointer-events-auto absolute bottom-4 right-4 rounded-full shadow-lg"
          aria-label={t.app.ai.open}
          aria-pressed={open}
          size="icon"
          variant={open ? 'secondary' : 'default'}
          onClick={() => setOpen((value) => !value)}
        >
          <Sparkles className="size-4" />
        </Button>
      )}
    </div>
  );
}
