import React from 'react'

type ButtonState = 'default' | 'loading' | 'success'

interface ButtonProps {
  label: string,
  loadingLabel?: string,
  successLabel?: string,
  state?: ButtonState,
  onClick?: () => void
}

const LoadingButton = ({loadingLabel}) => (
  <span className="inline-flex rounded-md shadow-sm">
    <button
      disabled
      type="button"
      className="inline-flex items-center px-4 py-2 border border-transparent text-sm leading-5 font-medium rounded-md text-white bg-indigo-600 transition ease-in-out duration-150 cursor-wait opacity-75">
      <svg className="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
        <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
        <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
      </svg>

      <span>{loadingLabel}</span>
    </button>
  </span>
)

const SuccessButton = ({successLabel}) => (
  <span className="inline-flex rounded-md shadow-sm">
    <button
      disabled
      type="button"
      className="inline-flex items-center px-4 py-2 border border-transparent text-sm leading-5 font-medium rounded-md text-white bg-green-500 transition ease-in-out duration-150 cursor-default">
      <span>{successLabel}</span>
    </button>
  </span>
)

const DefaultButton = ({label, onClick}) => (
  <span className="inline-flex rounded-md shadow-sm">
    <button
      onClick={onClick}
      type="button"
      className="inline-flex items-center px-4 py-2 border border-transparent text-sm leading-5 font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-500 focus:outline-none focus:border-indigo-700 focus:shadow-outline-indigo active:bg-indigo-700 transition ease-in-out duration-150">
      <span>{label}</span>
    </button>
  </span>
)

export const Button:React.FC<ButtonProps> = ({
  label,
  loadingLabel = 'Loading...',
  successLabel = 'Success!',
  state = 'default',
  onClick = null
}) => {
  switch (state) {
    case 'loading':
      return <LoadingButton loadingLabel={loadingLabel} />

    case 'success':
      return <SuccessButton successLabel={successLabel} />

    default:
      return <DefaultButton {...{label, onClick}} />
  }
}