import * as React from "react";
import { action, observable } from "mobx";
import { Transition } from "react-transition-group";
import { CloseButton } from "./svg/CloseButton";
import color from "color";
import { observer } from "mobx-react";
import ScreenReaderOnlyText from "./ScreenReaderOnlyText";

interface DefaultCloseButtonProps {
  onClick?: () => void
}

const mainColor = '#969696'
const darkenedColor = color(mainColor).darken(0.1).hex()
const defaultStyles = {
  foreground: {
    fill: mainColor
  },
  background: {
    stroke: mainColor,
    fill: '#FFFFFF'
  }
}

const states: { [state: string]: any } = {
  entering: {
    foreground: {
      fill: darkenedColor,
      transition: 'fill 250ms ease-in-out'
    },
    background: {
      stroke: darkenedColor,
      transition: 'stroke 250ms ease-in-out'
    }
  },
  entered: {
    foreground: {
      fill: darkenedColor,
    },
    background: {
      stroke: darkenedColor,
    }
  },
  exiting: {
    foreground: {
      fill: mainColor,
      transition: 'fill 250ms ease-in-out'
    },
    background: {
      stroke: mainColor,
      transition: 'stroke 250ms ease-in-out'
    }
  },
  exited: {
    foreground: {
      fill: mainColor,
    },
    background: {
      stroke: mainColor,
    }
  }
}

@observer
export class DefaultCloseButton extends React.Component<DefaultCloseButtonProps, {}> {
  @observable
  hovering: boolean

  @observable
  focusing: boolean

  @action.bound
  mouseEnter() {
    this.hovering = true;
  }

  @action.bound
  mouseLeave() {
    this.hovering = false;
  }

  @action.bound
  keyDown(event: React.KeyboardEvent<HTMLAnchorElement>) {
    if (event.key == 'Enter') {
      event.preventDefault();
      this.props.onClick();
    }
  }

  render() {
    return <Transition in={this.hovering} timeout={250}>
      {(hoverState) => {
        const backgroundStyle = {
          ...defaultStyles.background,
          ...((states[hoverState] && states[hoverState].background) || {})
        }

        const foregroundStyle =
        {
          ...defaultStyles.foreground,
          ...((states[hoverState] && states[hoverState].foreground) || {})
        }

        return <a onMouseEnter={this.mouseEnter} onMouseLeave={this.mouseLeave} onClick={this.props.onClick} onKeyDown={this.keyDown} tabIndex={0} className={'focusable_item'}>
          <CloseButton backgroundCircleStyle={backgroundStyle}
            foregroundCircleStyle={foregroundStyle}
          /><ScreenReaderOnlyText>Close modal</ScreenReaderOnlyText>
        </a>

      }
      }
    </Transition>

  }
}