import React from 'react';
import ReactSwipeableViews from 'react-swipeable-views';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
import Video from 'mastodon/features/video';
import classNames from 'classnames';
import { defineMessages, injectIntl } from 'react-intl';
import IconButton from 'mastodon/components/icon_button';
import ImmutablePureComponent from 'react-immutable-pure-component';
import ImageLoader from './image_loader';
import Icon from 'mastodon/components/icon';
import GIFV from 'mastodon/components/gifv';
import { disableSwiping } from 'mastodon/initial_state';
import Footer from 'mastodon/features/picture_in_picture/components/footer';
import { getAverageFromBlurhash } from 'mastodon/blurhash';
const messages = defineMessages({
  close: { id: 'lightbox.close', defaultMessage: 'Close' },
  previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },
  next: { id: 'lightbox.next', defaultMessage: 'Next' },
});
export const previewState = 'previewMediaModal';
export default @injectIntl
class MediaModal extends ImmutablePureComponent {
  static propTypes = {
    media: ImmutablePropTypes.list.isRequired,
    statusId: PropTypes.string,
    index: PropTypes.number.isRequired,
    onClose: PropTypes.func.isRequired,
    intl: PropTypes.object.isRequired,
    onChangeBackgroundColor: PropTypes.func.isRequired,
    currentTime: PropTypes.number,
    autoPlay: PropTypes.bool,
    volume: PropTypes.number,
  };
  static contextTypes = {
    router: PropTypes.object,
  };
  state = {
    index: null,
    navigationHidden: false,
    zoomButtonHidden: false,
  };
  handleSwipe = (index) => {
    this.setState({ index: index % this.props.media.size });
  }
  handleTransitionEnd = () => {
    this.setState({
      zoomButtonHidden: false,
    });
  }
  handleNextClick = () => {
    this.setState({
      index: (this.getIndex() + 1) % this.props.media.size,
      zoomButtonHidden: true,
    });
  }
  handlePrevClick = () => {
    this.setState({
      index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size,
      zoomButtonHidden: true,
    });
  }
  handleChangeIndex = (e) => {
    const index = Number(e.currentTarget.getAttribute('data-index'));
    this.setState({
      index: index % this.props.media.size,
      zoomButtonHidden: true,
    });
  }
  handleKeyDown = (e) => {
    switch(e.key) {
    case 'ArrowLeft':
      this.handlePrevClick();
      e.preventDefault();
      e.stopPropagation();
      break;
    case 'ArrowRight':
      this.handleNextClick();
      e.preventDefault();
      e.stopPropagation();
      break;
    }
  }
  componentDidMount () {
    window.addEventListener('keydown', this.handleKeyDown, false);
    if (this.context.router) {
      const history = this.context.router.history;
      history.push(history.location.pathname, previewState);
      this.unlistenHistory = history.listen(() => {
        this.props.onClose();
      });
    }
    this._sendBackgroundColor();
  }
  componentDidUpdate (prevProps, prevState) {
    if (prevState.index !== this.state.index) {
      this._sendBackgroundColor();
    }
  }
  _sendBackgroundColor () {
    const { media, onChangeBackgroundColor } = this.props;
    const index = this.getIndex();
    const blurhash = media.getIn([index, 'blurhash']);
    if (blurhash) {
      const backgroundColor = getAverageFromBlurhash(blurhash);
      onChangeBackgroundColor(backgroundColor);
    }
  }
  componentWillUnmount () {
    window.removeEventListener('keydown', this.handleKeyDown);
    if (this.context.router) {
      this.unlistenHistory();
      if (this.context.router.history.location.state === previewState) {
        this.context.router.history.goBack();
      }
    }
    this.props.onChangeBackgroundColor(null);
  }
  getIndex () {
    return this.state.index !== null ? this.state.index : this.props.index;
  }
  toggleNavigation = () => {
    this.setState(prevState => ({
      navigationHidden: !prevState.navigationHidden,
    }));
  };
  handleStatusClick = e => {
    if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
      e.preventDefault();
      this.context.router.history.push(`/statuses/${this.props.statusId}`);
    }
  }
  render () {
    const { media, statusId, intl, onClose } = this.props;
    const { navigationHidden } = this.state;
    const index = this.getIndex();
    const leftNav  = media.size > 1 && ;
    const rightNav = media.size > 1 && ;
    const content = media.map((image) => {
      const width  = image.getIn(['meta', 'original', 'width']) || null;
      const height = image.getIn(['meta', 'original', 'height']) || null;
      if (image.get('type') === 'image') {
        return (