import { BaseDriver } from 'wix-ui-test-utils/driver-factory';
import { SyntheticEventData } from 'react-dom/test-utils';
import { InputSize } from './index';
import { FocusOptionsPolyfill, StatusIndications } from '../common';

export interface InputDriver extends BaseDriver {
  trigger: (trigger: string, event: SyntheticEventData) => void;
  focus: (options?: FocusOptionsPolyfill) => FocusOptionsPolyfill;
  blur: () => void;
  getName: () => string | null;
  getMaxLength: () => string | null;
  getType: () => string | null;
  keyDown: (key: SyntheticEventData['key']) => void;
  click: () => void;
  clickUnit: () => void;
  clickMagnifyingGlass: () => void;
  clickCustomAffix: () => void;
  clickClear: () => void;
  clickIconAffix: () => void;
  clickMenuArrow: () => void;
  mouseOver: () => void;
  mouseOut: () => void;
  clearText: () => void;
  enterText: (text: string) => void;
  getValue: () => string;
  getText: () => string;
  getPlaceholder: () => string;
  getDefaultValue: () => string;
  getTabIndex: () => number;
  getReadOnly: () => boolean;
  getDisabled: () => boolean;
  getTextOverflow: () => string;
  getAriaLabel: () => string | null;
  getAriaControls: () => string | null;
  getAriaDescribedby: () => string | null;
  getAutocomplete: () => string | null;
  getRequired: () => boolean;
  hasPrefix: () => boolean;
  hasSuffix: () => boolean;
  prefixComponentExists: (style: string) => boolean;
  suffixComponentExists: (style: string) => boolean;
  getDataHook: () => string | null;
  getUnit: () => string;
  getCustomAffix: () => string;
  hasMagnifyingGlass: () => boolean;
  hasMenuArrow: () => boolean;
  hasClearButton: () => boolean;
  isRTL: () => boolean;
  isFocusedStyle: () => boolean;
  isHoveredStyle: () => boolean;
  isDisabled: () => boolean;
  isOfSize: (size: InputSize) => boolean;
  getSize: () => string | null;
  isFocus: () => boolean;
  startComposing: () => void;
  endComposing: () => void;
  getCursorLocation: () => number;
  getRootElementClasses: () => string;
  getInputElementClasses: () => string;
  hasRightBorderRadius: () => boolean;
  hasLeftBorderRadius: () => boolean;
  isCustomInput: () => boolean;

  // Status
  hasStatus: (status: StatusIndications) => boolean;
  getStatusMessage: () => string | null;
}
