import * as React from 'react';
import { Widget } from '@lumino/widgets';
import { ChatMessages } from '../../Chat/ChatMessages';
import { ConversationService } from '../../Chat/ConversationService';
import { IChatService } from '../../Services/IChatService';
import { ServiceProvider } from '../../Services/ServiceFactory';
import { ChatHistoryManager } from '../../Chat/ChatHistoryManager';
import { ThreadManager } from '../../ThreadManager';
import { ChatUIHelper } from '../../Chat/ChatUIHelper';
import { ChatboxContext } from '../ChatboxContext';
import { NewChatDisplayWidget } from '../NewChatDisplayWidget';
import { LLMStateDisplay } from '../LLMStateDisplay/LLMStateDisplay';
import { PlanStateDisplay } from '../PlanStateDisplay';
import { UpdateBannerWidget } from '../UpdateBanner/UpdateBannerWidget';
import { ChatInputContainerRef } from '../Chat';
import { IMountedComponent } from '../../utils/reactMount';

/**
 * Claude settings interface
 */
export interface ClaudeSettings {
  claudeApiKey: string;
  claudeModelId: string;
  claudeModelUrl: string;
}

// ToolbarElements interface removed - toolbar is now React-based

/**
 * History container elements interface
 */
export interface HistoryContainerElements {
  historyContainer: HTMLDivElement;
  chatHistory: HTMLDivElement;
  chatHistoryLoadingOverlay: HTMLDivElement;
  scrollDownButton: HTMLButtonElement;
}

/**
 * Result from setupScrollHandling with cleanup function
 */
export interface ScrollHandlingResult {
  resizeObserver: ResizeObserver;
  cleanup: () => void;
}

/**
 * ChatBoxWidget state interface
 */
export interface ChatBoxWidgetState {
  // DOM elements
  chatHistory: HTMLDivElement;
  lastNotebookId: string | null;

  // Widget management
  historyWidget: Widget | null;
  newChatDisplayWidget: NewChatDisplayWidget | null;
  llmStateDisplay: LLMStateDisplay;
  planStateDisplay: PlanStateDisplay;
  chatHistoryLoadingOverlay: HTMLDivElement | null;
  updateBanner: UpdateBannerWidget | null;
  scrollDownButton: HTMLButtonElement;
  stateDisplayContainer: HTMLDivElement | null;

  // React toolbar components
  toolbarContainerElement: HTMLDivElement;
  toolbarMounted?: IMountedComponent;

  // Chat services
  messageComponent: ChatMessages;
  chatService: IChatService;
  conversationService: ConversationService;
  currentServiceProvider: ServiceProvider;
  chatHistoryManager: ChatHistoryManager;

  // Helper classes
  threadManager: ThreadManager;
  uiHelper: ChatUIHelper;
  contextHandler: ChatboxContext;

  // React input container
  inputContainerRef: React.RefObject<ChatInputContainerRef>;
  inputContainerElement?: HTMLDivElement;
  inputContainerMounted?: IMountedComponent;

  // New prompt CTA (React component)
  newPromptCtaContainer: HTMLDivElement | null;
  newPromptCtaMounted?: IMountedComponent;

  // Observer cleanup
  resizeObserver?: ResizeObserver;
  mutationObserver?: MutationObserver;
  llmStateConnection?: any;
  planStateConnection?: any;
  appStateSubscription?: { unsubscribe: () => void };
  lastClaudeSettings?: ClaudeSettings;

  // Welcome message state
  hasShownWelcomeMessage: boolean;
  welcomeMessagePromise: Promise<void> | null;
  isWelcomeMessageReady: boolean;
  isWelcomeMessageHidden: boolean;

  // Ready state
  isReady: boolean;
}
