/* eslint react/prop-types: 0 */
import React, { useMemo, useContext, useState } from 'react';
import { TextSelection } from 'prosemirror-state';
import styled from 'styled-components';
import * as tablesFn from 'prosemirror-tables';
import { WaxContext } from 'wax-prosemirror-core';
import Dropdown from 'react-dropdown';
import 'react-dropdown/style.css';

const DropdownStyled = styled(Dropdown)`
  display: inline-flex;
  opacity: ${props => (props.select ? 1 : 0.4)};
  pointer-events: ${props => (props.select ? 'default' : 'none')};

  .Dropdown-control {
    border: none;

    &:hover {
      box-shadow: none;
    }
  }

  .Dropdown-arrow {
    right: 25px;
    top: 14px;
  }

  .Dropdown-menu {
    align-items: flex-start;
    display: flex;
    flex-direction: column;
    width: 120%;

    .Dropdown-option {
      width: 100%;
    }
  }
`;

const dropDownOptions = [
  { label: 'add column before', value: 'addColumnBefore' },
  { label: 'add column after', value: 'addColumnAfter' },
  { label: 'Delete column', value: 'deleteColumn' },
  { label: 'Insert row before', value: 'addRowBefore' },
  { label: 'Insert row after', value: 'addRowAfter' },
  { label: 'Delete row', value: 'deleteRow' },
  { label: 'Delete table', value: 'deleteTable' },
  { label: 'Merge cells', value: 'mergeCells' },
  { label: 'Split cell', value: 'splitCell' },
  { label: 'Toggle header column', value: 'toggleHeaderColumn' },
  { label: 'Toggle header row', value: 'toggleHeaderRow' },
  { label: 'Toggle header cells', value: 'toggleHeaderCell' },
];

const TableDropDown = ({ view: { dispatch, state }, item }) => {
  const { activeView } = useContext(WaxContext);
  const [selectedOption, setSelectedOption] = useState('');

  const isDisabled = item.select(activeView.state);
  const TableDropDownComponent = useMemo(
    () => (
      <DropdownStyled
        onChange={option => {
          item.run(activeView.state, dispatch, tablesFn[option.value]);
          setSelectedOption(option.value);

          setTimeout(() => {
            activeView.focus();
          });
        }}
        options={dropDownOptions}
        placeholder="Table Options"
        select={isDisabled}
      />
    ),
    [isDisabled, selectedOption],
  );

  return TableDropDownComponent;
};

export default TableDropDown;