import * as actions from '../../../actions/index';
import ClipperShape from 'clipper-js';
import * as d2Tools from '../../../constants/d2Tools';
import subtractShapeFromState from '../../../utils/subtractShapeFromState';
import { CLIPPER_PRECISION } from '../../../constants/d2Constants.js';
// import createDebug from 'debug';
// const debug = createDebug('d3d:reducer:eraser');

export default function eraserReducer(state, action) {
  switch (action.type) {
    case actions.D2_TAP:
      return handleEraser(state, [action.position], action.screenMatrixZoom);

    case actions.D2_DRAG_START:
      return handleEraser(state, action.preDrags, action.screenMatrixZoom);

    case actions.D2_DRAG:
      return handleEraser(state, [action.previousPosition, action.position], action.screenMatrixZoom);

    default:
      return state;
  }
}

function handleEraser(state, path, screenMatrixZoom) {
  // create eraser line from prev mouse position to new mouse position
  const eraserShape = new ClipperShape([path], false, true, true).offset(state.d2.eraser.size, {
    jointType: 'jtRound',
    endType: 'etOpenRound',
    miterLimit: 2.0,
    roundPrecision: 0.25
  });

  return subtractShapeFromState(state, eraserShape, d2Tools.ERASER, { matrix: screenMatrixZoom, scale: CLIPPER_PRECISION });
}
