/**
 * Widget renderer - renders the appropriate widget component based on type
 */

/* eslint-disable @typescript-eslint/no-unnecessary-condition */

import { WidgetWrapper } from "./WidgetWrapper";
import {
  TasksWidget,
  CalendarWidget,
  QuickCaptureWidget,
  AgentStatusWidget,
} from "@/components/widgets";
import type { WidgetPlacement } from "@mosaic/shared";

export interface WidgetRendererProps {
  widget: WidgetPlacement;
  isEditing?: boolean;
  onRemove?: (widgetId: string) => void;
}

const WIDGET_COMPONENTS = {
  tasks: TasksWidget,
  calendar: CalendarWidget,
  "quick-capture": QuickCaptureWidget,
  "agent-status": AgentStatusWidget,
};

const WIDGET_CONFIG = {
  tasks: {
    displayName: "Tasks",
    description: "View and manage your tasks",
  },
  calendar: {
    displayName: "Calendar",
    description: "Upcoming events and schedule",
  },
  "quick-capture": {
    displayName: "Quick Capture",
    description: "Capture ideas and notes",
  },
  "agent-status": {
    displayName: "Agent Status",
    description: "View running agent sessions",
  },
};

export function WidgetRenderer({
  widget,
  isEditing = false,
  onRemove,
}: WidgetRendererProps): React.JSX.Element {
  // Extract widget type from ID (e.g., "tasks-123" -> "tasks")
  const widgetType = widget.i.split("-")[0] as keyof typeof WIDGET_COMPONENTS;
  const WidgetComponent = WIDGET_COMPONENTS[widgetType];
  const config = WIDGET_CONFIG[widgetType] || { displayName: "Widget", description: "" };

  if (!WidgetComponent) {
    const wrapperProps = {
      id: widget.i,
      title: "Unknown Widget",
      isEditing: isEditing,
      ...(onRemove && {
        onRemove: (): void => {
          onRemove(widget.i);
        },
      }),
    };

    return (
      <WidgetWrapper {...wrapperProps}>
        <div className="text-gray-500 text-sm">Widget type not found: {widgetType}</div>
      </WidgetWrapper>
    );
  }

  const wrapperProps = {
    id: widget.i,
    title: config.displayName,
    isEditing: isEditing,
    ...(onRemove && {
      onRemove: (): void => {
        onRemove(widget.i);
      },
    }),
  };

  return (
    <WidgetWrapper {...wrapperProps}>
      <WidgetComponent id={widget.i} />
    </WidgetWrapper>
  );
}
