import './Forms.css';

import {
  Button,
  Dimmer,
  Divider,
  Form,
  Header,
  Icon,
  Input,
  Loader,
  Modal,
  Segment,
  TextArea,
} from 'semantic-ui-react';
import React, { Component } from 'react';
import {
  addDocument,
  addSolution,
  clearWrite,
  getDocuments,
  getSolutions,
  writeSolution,
  writeSolutionFile,
} from '../../actions/homework';

import ConfirmModal from './ConfirmModal';
import { connect } from 'react-redux';
import { customMessage } from '../pages/Homework';

const allowedFileTypes = [
  'image/jpeg',
  'image/png',
  'application/zip',
  'application/x-zip',
];

// in megabytes
const maxFileSize = 50;

class AddSolutionForm extends Component {
  constructor(props) {
    super(props);
    this.state = {
      showModal: false,
      loading: false,
    };
  }

  render() {
    const { name, description, file } = this.props.newSolution;

    const task = this.props.taskid;

    const thisTaskSolution = this.props.homeworks.solutions.filter(
      (solution) => solution.task === task
    );
    const thisTaskDocument = this.props.homeworks.documents.filter(
      (document) => document.solution === thisTaskSolution[0]?.id
    );

    const lastName = thisTaskDocument[0]?.name;
    const lastDesc = thisTaskDocument[0]?.description;
    const lastFile = thisTaskDocument[0]?.file_url;

    const corrected = false;
    const accepted = false;
    const sentences = this.props.taskdesc.split('\n');
    const note = '';
    const disabledText = 'A határidő lejárt, további beadás nem lehetséges.';

    return (
      <Modal
        open={this.state.showModal}
        closeOnDimmerClick
        onClose={() => this.setState({ showModal: false })}
        trigger={
          <button
            type="button"
            id="task"
            onClick={() => {
              this.setState({ showModal: true });
            }}
          >
            <Icon name="external" />
            {this.props.tasktitle}
          </button>
        }
      >
        <Modal.Header>
          {this.props.multiple ? 'Másik megoldás' : 'Megoldás'} beadása a(z)
          {this.props.tasktitle} nevű feladathoz:
        </Modal.Header>
        <Modal.Content>
          <Modal.Description style={{ marginBottom: '2em' }}>
            <Header as="h5">Feladat leírása:</Header>
            {sentences.map((s) => (
              <p key={Math.random()}>{s}</p>
            ))}
          </Modal.Description>
          {this.props.disabled ? (
            <div>
              {lastName ? (
                <div style={{ paddingBottom: '1em' }}>
                  <div style={{ marginBottom: '1em', fontWeight: 'bold' }}>
                    Legutóbbi megoldásod:
                  </div>
                  <Segment attached="top">
                    <h5 style={{ paddingBottom: '0.4em' }}>Cím:</h5>
                    {lastName}
                  </Segment>
                  <Segment attached>
                    <h5 style={{ paddingBottom: '0.4em' }}>Leírás:</h5>
                    {lastDesc}
                  </Segment>
                  <Segment attached="bottom">
                    <h5>Beadott fájl:</h5>
                    {lastFile ? (
                      <a href={lastFile} rel="noreferrer noopener" download>
                        Fájl letöltése
                      </a>
                    ) : (
                      <span>-</span>
                    )}
                  </Segment>
                </div>
              ) : (
                customMessage(
                  disabledText,
                  undefined,
                  undefined,
                  this.props.disabled
                )
              )}
            </div>
          ) : (
            <Form>
              {lastName ? (
                <div style={{ paddingBottom: '1em' }}>
                  <div style={{ fontWeight: 'bold' }}>
                    Legutóbbi megoldásod:
                  </div>
                  <Segment attached="top">
                    <h5 style={{ paddingBottom: '0.4em' }}>Cím:</h5>
                    {lastName}
                  </Segment>
                  <Segment attached>
                    <h5 style={{ paddingBottom: '0.4em' }}>Leírás:</h5>
                    {lastDesc}
                  </Segment>
                  <Segment attached="bottom">
                    <h5>Beadott fájl:</h5>
                    {lastFile ? (
                      <a href={lastFile} rel="noreferrer noopener" download>
                        Fájl letöltése
                      </a>
                    ) : (
                      <span>-</span>
                    )}
                  </Segment>
                </div>
              ) : null}
              <Divider />
              <Form.Field
                control={Input}
                label="Megoldás címe:"
                name="name"
                onChange={(e) => this.props.writeSolution(e)}
                value={name}
                placeholder="Adj meg egy címet a beadandó megoldásodnak..."
              />
              <Form.Field
                control={TextArea}
                label="Megoldás leírása:"
                name="description"
                onChange={(e) => this.props.writeSolution(e)}
                value={description}
                placeholder="Add meg a megoldás leírását..."
              />
              <Form.Field>
                <label>
                  Fájl (Megengedett fájltípusok: png, jpeg, jpg, zip. Maximum 50
                  MB.):
                </label>
                <Input
                  type="file"
                  accept={allowedFileTypes.join(',')}
                  onChange={(e) => this.props.writeSolutionFile(e)}
                />
              </Form.Field>
            </Form>
          )}
        </Modal.Content>
        <Modal.Actions>
          <Button
            inverted
            color="red"
            onClick={() => {
              this.setState({ showModal: false });
              this.props.clearWrite();
            }}
          >
            <Icon name="remove" /> Mégse
          </Button>
          {this.props.multiple ? (
            <ConfirmModal
              button={
                <Button
                  disabled={
                    !name ||
                    !description ||
                    (!file
                      ? false
                      : !allowedFileTypes.includes(file.type) ||
                        file.size > maxFileSize * 1024 ** 2)
                  }
                  inverted
                  color="green"
                >
                  <Icon name="checkmark" />
                  Beadás
                  {this.state.loading ? (
                    <Dimmer active>
                      <Loader size="massive" />
                    </Dimmer>
                  ) : null}
                </Button>
              }
              text="beadod az új megoldást, ami felülírja az előzőt"
              onAccept={() => {
                this.setState({
                  loading: true,
                });
                this.props
                  .addSolution({
                    task,
                    accepted,
                    corrected,
                    note,
                    name,
                    description,
                    file,
                  })
                  .then(
                    () => {
                      this.setState({
                        loading: false,
                        showModal: false,
                      });
                      this.props.clearWrite();
                    },
                    () => {
                      this.setState({
                        loading: false,
                      });
                      alert('Sikertelen feltöltés!');
                    }
                  );
              }}
            />
          ) : (
            <Button
              inverted
              color="green"
              disabled={
                !name ||
                !description ||
                (!file
                  ? false
                  : !allowedFileTypes.includes(file.type) ||
                    file.size > maxFileSize * 1024 ** 2)
              }
              onClick={() => {
                this.props.addSolution({
                  task,
                  accepted,
                  corrected,
                  note,
                  name,
                  description,
                  file,
                });
                this.setState({ showModal: false });
                this.props.clearWrite();
              }}
            >
              <Icon name="checkmark" /> Beadás
            </Button>
          )}
        </Modal.Actions>
      </Modal>
    );
  }
}

const mapStateToProps = ({ newSolution, homeworks, user }) => ({
  newSolution,
  homeworks,
  user,
});

export default connect(mapStateToProps, {
  addSolution,
  writeSolution,
  writeSolutionFile,
  addDocument,
  getDocuments,
  clearWrite,
  getSolutions,
})(AddSolutionForm);