import type { KeyboardEvent, MouseEvent, TouchEvent } from 'react';

import type { IconProp } from '../components/icon';

interface BaseMenuItem {
  text: string;
  description?: string;
  icon?: IconProp;
  highlighted?: boolean;
  disabled?: boolean;
  dangerous?: boolean;
}

export interface ActionMenuItem extends BaseMenuItem {
  action: (event: MouseEvent | KeyboardEvent | TouchEvent) => void;
}

export interface LinkMenuItem extends BaseMenuItem {
  to: string;
}

export interface ExternalLinkMenuItem extends BaseMenuItem {
  href: string;
  target?: string;
  method?: 'post' | 'put' | 'delete';
}

export type MenuItem =
  | ActionMenuItem
  | LinkMenuItem
  | ExternalLinkMenuItem
  | null;

export const isMenuItem = (item: unknown): item is MenuItem => {
  if (item === null) {
    return true;
  }

  return typeof item === 'object' && 'text' in item;
};

export const isActionItem = (item: unknown): item is ActionMenuItem => {
  if (!item || !isMenuItem(item)) {
    return false;
  }

  return 'action' in item;
};

export const isExternalLinkItem = (
  item: unknown,
): item is ExternalLinkMenuItem => {
  if (!item || !isMenuItem(item)) {
    return false;
  }

  return 'href' in item;
};
