import PropTypes from 'prop-types';
import React from 'react';
import Helmet from 'react-helmet';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import PreviewFrame from '../components/PreviewFrame';
import PreviewNav from '../../../components/PreviewNav';
import { getHTMLFile, getJSFiles, getCSSFiles } from '../reducers/files';
import * as ProjectActions from '../actions/project';

class FullView extends React.Component {
  componentDidMount() {
    this.props.getProject(this.props.params.project_id);
    document.body.className = this.props.theme;
  }

  componentWillUpdate(nextProps) {
    if (nextProps.theme !== this.props.theme) {
      document.body.className = nextProps.theme;
    }
  }

  ident = () => {}

  render() {
    return (
      <div className="fullscreen-preview">
        <Helmet>
          <title>{this.props.project.name}</title>
        </Helmet>
        <PreviewNav
          owner={{ username: this.props.project.owner ? `${this.props.project.owner.username}` : '' }}
          project={{ name: this.props.project.name, id: this.props.params.project_id }}
        />
        <div className="preview-frame-holder">
          <PreviewFrame
            htmlFile={this.props.htmlFile}
            jsFiles={this.props.jsFiles}
            cssFiles={this.props.cssFiles}
            files={this.props.files}
            head={
              <link type="text/css" rel="stylesheet" href="/preview-styles.css" />
            }
            fullView
            isPlaying
            isAccessibleOutputPlaying={false}
            textOutput={false}
            gridOutput={false}
            soundOutput={false}
            dispatchConsoleEvent={this.ident}
            endSketchRefresh={this.ident}
            previewIsRefreshing={false}
            setBlobUrl={this.ident}
            stopSketch={this.ident}
            expandConsole={this.ident}
            clearConsole={this.ident}
          />
        </div>
      </div>
    );
  }
}

FullView.propTypes = {
  theme: PropTypes.string.isRequired,
  params: PropTypes.shape({
    project_id: PropTypes.string
  }).isRequired,
  project: PropTypes.shape({
    name: PropTypes.string,
    owner: PropTypes.shape({
      username: PropTypes.string
    })
  }).isRequired,
  htmlFile: PropTypes.shape({
    id: PropTypes.string.isRequired,
    content: PropTypes.string.isRequired,
    name: PropTypes.string.isRequired
  }).isRequired,
  jsFiles: PropTypes.arrayOf(PropTypes.shape({
    id: PropTypes.string.isRequired,
    content: PropTypes.string.isRequired,
    name: PropTypes.string.isRequired
  })).isRequired,
  cssFiles: PropTypes.arrayOf(PropTypes.shape({
    id: PropTypes.string.isRequired,
    content: PropTypes.string.isRequired,
    name: PropTypes.string.isRequired
  })).isRequired,
  getProject: PropTypes.func.isRequired,
  files: PropTypes.arrayOf(PropTypes.shape({
    id: PropTypes.string.isRequired,
    content: PropTypes.string.isRequired,
    name: PropTypes.string.isRequired
  })).isRequired,
};

function mapStateToProps(state) {
  return {
    user: state.user,
    theme: state.preferences.theme,
    htmlFile: getHTMLFile(state.files),
    jsFiles: getJSFiles(state.files),
    cssFiles: getCSSFiles(state.files),
    project: state.project,
    files: state.files
  };
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators(ProjectActions, dispatch);
}

export default connect(mapStateToProps, mapDispatchToProps)(FullView);