import * as React from 'react';

type SidebarItemNextSpecificProps = {
  children?: React.ReactNode;
  dataHook?: string;
  className?: string;
  suffix?: React.ReactNode;
  prefix?: React.ReactNode;
  onMouseEnter?: React.MouseEventHandler<HTMLButtonElement>;
  onMouseLeave?: React.MouseEventHandler<HTMLButtonElement>;
  disabled?: boolean;
  onClick?: React.MouseEventHandler<HTMLButtonElement>;
  itemKey?: string;
  role?: string;
};

/**
 * Omit SidebarItemNext specific properties.
 */
type OmitHTMLAttributes<T> = Omit<T, keyof SidebarItemNextSpecificProps>;

export type SidebarItemNextWithAsProp<T> =
  | SidebarItemNextAsButtonProps<T>
  | SidebarItemNextAsAnchorProps<T>
  | SidebarItemNextGenericProps<T>
  | SidebarItemNextAsComponentProps<T>;

type SidebarItemNextAsButtonProps<T> = OmitHTMLAttributes<
  React.ButtonHTMLAttributes<HTMLButtonElement>
> &
  T & {
    as?: 'button';
    onClick?: React.MouseEventHandler<HTMLButtonElement>;
  };

type SidebarItemNextAsAnchorProps<T> = OmitHTMLAttributes<
  React.AnchorHTMLAttributes<HTMLAnchorElement>
> &
  T & {
    as: 'a';
    onClick?: React.MouseEventHandler<HTMLAnchorElement>;
  };

type SidebarItemNextGenericProps<T> = T & {
  as: keyof Omit<HTMLElementTagNameMap, 'a' | 'button'>;
  onClick?: React.MouseEventHandler<HTMLElement>;
  [additionalProps: string]: any;
};

type SidebarItemNextAsComponentProps<T> = T & {
  as: React.ComponentType<any>;
  onClick?: React.MouseEventHandler<HTMLElement>;
  [additionalProps: string]: any;
};

export type SidebarItemNextProps =
  SidebarItemNextWithAsProp<SidebarItemNextSpecificProps>;

declare const SidebarItemNext: React.FC<SidebarItemNextProps>;

export default SidebarItemNext;
