/* global document */

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import OpenSeadragon from 'openseadragon';
import blankIcon from '../../../images/blank.svg';
import imageFullscreenIcon from '../../../images/imageFullscreen.svg';
import imageFullscreenActiveIcon from '../../../images/imageFullscreenActive.svg';
import imageHomeIcon from '../../../images/imageHome.svg';
import imageHomeActiveIcon from '../../../images/imageHomeActive.svg';
import imageZoomInIcon from '../../../images/imageZoomIn.svg';
import imageZoomInActiveIcon from '../../../images/imageZoomInActive.svg';
import imageZoomOutIcon from '../../../images/imageZoomOut.svg';
import imageZoomOutActiveIcon from '../../../images/imageZoomOutActive.svg';
import styles from '../../../styles/cspace-ui/ImageViewer.css';
import saveLinkStyles from '../../../styles/cspace-ui/ImageViewerSaveLink.css';

const propTypes = {
  blobUrl: PropTypes.string.isRequired,
  filename: PropTypes.string,
};

const defaultProps = {
  filename: '',
};

export default class ImageViewer extends Component {
  constructor() {
    super();

    this.handleContainerRef = this.handleContainerRef.bind(this);
  }

  componentDidMount() {
    const {
      blobUrl,
      filename,
    } = this.props;

    const viewer = OpenSeadragon({
      element: this.containerElement,
      navImages: {
        zoomIn: {
          REST: imageZoomInIcon,
          GROUP: blankIcon,
          HOVER: imageZoomInActiveIcon,
          DOWN: imageZoomInActiveIcon,
        },
        zoomOut: {
          REST: imageZoomOutIcon,
          GROUP: blankIcon,
          HOVER: imageZoomOutActiveIcon,
          DOWN: imageZoomOutActiveIcon,
        },
        home: {
          REST: imageHomeIcon,
          GROUP: blankIcon,
          HOVER: imageHomeActiveIcon,
          DOWN: imageHomeActiveIcon,
        },
        fullpage: {
          REST: imageFullscreenIcon,
          GROUP: blankIcon,
          HOVER: imageFullscreenActiveIcon,
          DOWN: imageFullscreenActiveIcon,
        },
      },
      prefixUrl: '',
      showNavigator: true,
      tileSources: {
        type: 'image',
        url: blobUrl,
      },
    });

    const saveLink = document.createElement('a');
    saveLink.className = saveLinkStyles.common;
    saveLink.href = blobUrl;
    saveLink.download = filename;
    saveLink.title = 'Save';

    viewer.buttons.element.appendChild(saveLink);

    this.viewer = viewer;
  }

  componentWillUnmount() {
    if (this.viewer) {
      this.viewer.destroy();
    }

    this.viewer = null;
  }

  handleContainerRef(ref) {
    this.containerElement = ref;
  }

  render() {
    return (
      <div className={styles.common}>
        <div ref={this.handleContainerRef} />
      </div>
    );
  }
}

ImageViewer.propTypes = propTypes;
ImageViewer.defaultProps = defaultProps;
