import * as React from 'react';
import { InputProps } from '../Input';
import { GoogleMapsClient } from '../clients';

type Address = {
  formatted: string;
  formattedStreetAddress: string;
  latLng: {
    lat: string;
    lng: string;
  };
  approximate: boolean;
  city?: string;
  state?: string;
  country?: string;
  countryCode?: string;
  street?: string;
  number?: string;
  postalCode?: string;
  subpremise?: string;
};

export interface GoogleAddressInputProps
  extends Omit<
    InputProps,
    'onChange' | 'onBlur' | 'onFocus' | 'onKeyDown' | 'onKeyUp' | 'onPaste'
  > {
  placeholder?: string;
  valuePrefix?: string;
  countryCode?: string;
  value?: string;
  status?: InputProps['status'];
  statusMessage?: InputProps['statusMessage'];
  onChange?: React.ChangeEventHandler<HTMLInputElement>;
  onBlur?: React.FocusEventHandler<HTMLInputElement>;
  onFocus?: React.FocusEventHandler<HTMLInputElement>;
  onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
  onKeyUp?: React.KeyboardEventHandler<HTMLInputElement>;
  onPaste?: React.ClipboardEventHandler<HTMLInputElement>;
  onSet?: (params: {
    originValue: string;
    googleResult: any;
    address: Address;
  }) => void;
  magnifyingGlass?: boolean;
  readOnly?: boolean;
  autoSelect?: boolean;
  clearSuggestionsOnBlur?: boolean;
  fallbackToManual?: boolean;
  poweredByGoogle?: boolean;
  footer?: string;
  types?: any[];
  filterTypes?: any[];
  placeDetailsFields?: any[];
  footerOptions?: object;
  handler?: 'geocode' | 'places';
  Client: new () => GoogleMapsClient;
}

export default class GoogleAddressInput extends React.Component<GoogleAddressInputProps> {
  select: () => void;
  focus: () => void;
}
