import {
  type ActionRow,
  type Button,
  type ChannelSelectMenu,
  type GuildChannelTypes,
  type MentionableSelectMenu,
  type PartialEmoji,
  type RoleSelectMenu,
  type StringSelectMenu,
  type TextInput,
  type UserSelectMenu,
  type LabelComponent,
  type ContainerComponent,
  type TextDisplayComponent,
  type SectionComponent,
  type MediaGalleryComponent,
  type SeparatorComponent,
  type FileComponent,
  type InteractionButton,
  type URLButton,
  type PremiumButton,
  type ThumbnailComponent,
} from '@projectdysnomia/dysnomia';

declare namespace JSX {
  type Component =
    | Button
    | StringSelectMenu
    | UserSelectMenu
    | RoleSelectMenu
    | MentionableSelectMenu
    | ChannelSelectMenu
    | TextInput
    | LabelComponent
    | ContainerComponent
    | TextDisplayComponent
    | SectionComponent
    | MediaGalleryComponent
    | SeparatorComponent
    | FileComponent
    | InteractionButton
    | URLButton
    | PremiumButton
    | ThumbnailComponent;

  type Element = Component | Promise<Component>;

  interface ElementClass {
    render: any;
  }

  interface ElementAttributesProperty {
    props: {};
  }

  interface IntrinsicElements {
    // Allow any element, but prefer known elements
    [elemName: string]: any;
    // Known elements
    ActionRow: { children: any | any[] };
    Button: { label: string; customId: string; style?: number; emoji?: PartialEmoji; disabled?: boolean };
    Container: { accent?: number; spoiler?: boolean; children: any | any[] };
    TextDisplay: { content: string };
  }
}
