import update from 'react-addons-update';
import * as THREE from 'three';
import shortid from 'shortid';
import { SHAPE_TYPE_PROPERTIES } from '../constants/shapeTypeProperties.js';
import createDebug from 'debug';
const debug = createDebug('d3d:reducer:object');

function generateUID(state) {
  return `S${state.objectIdCounter}`;
}

export function addObject(state, object, UID = generateUID(state)) {
  const { defaultProperties } = SHAPE_TYPE_PROPERTIES[object.type];

  object = {
    ...defaultProperties,
    color: state.context.color,
    space: state.activeSpace,
    ...object,
    UID
  };

  debug('addObject: ', UID);
  state = update(state, {
    spaces: { [object.space]: { objectIds: { $push: [UID] } } },
    objectsById: { [UID]: { $set: object } },
    objectIdCounter: { $set: state.objectIdCounter + 1 }
  });

  return state;
}
export function removeObject(state, UID) {
  debug('removeObject: ', UID);

  const object = state.objectsById[UID];
  const { space } = object;

  const filteredObjectIds = state.spaces[space].objectIds;

  const filteredObjectsById = { ...state.objectsById };
  delete filteredObjectsById[UID];

  return update(state, {
    spaces: { [space]: { objectIds: { $splice: [[filteredObjectIds.indexOf(UID), 1]] } } },
    objectsById: { $set: filteredObjectsById }
  });
}
export function removeAllObjects(state) {
  debug('removeAllObjects: ');

  return update(state, {
    objectsById: { $set: {} },
    activeSpace: { $set: 'world' },
    spaces: { $set: {
      world: {
        matrix: new THREE.Matrix4(),
        objectIds: []
      }
    } }
  });
}
export function setActive2D(state, UID) {
  debug('activeShape: ', UID);
  return update(state, {
    d2: { activeShape: { $set: UID } }
  });
}
export function addObjectActive2D(state, object) {
  const UID = generateUID(state);
  state = addObject(state, object, UID);
  return setActive2D(state, UID);
}
export function removeObjectActive2D(state, UID) {
  const newState = removeObject(state, UID);
  return setActive2D(newState, null);
}

export function getActive2D(state) {
  return state.d2.activeShape ? state.objectsById[state.d2.activeShape] : null;
}

export function addSpaceActive(state, matrix, space = shortid.generate()) {
  state = addSpace(state, matrix, space);
  return setActiveSpace(state, space);
}

export function setActiveSpace(state, space) {
  debug('activeSpace: ', space);
  return update(state, { activeSpace: { $set: space } });
}

export function addSpace(state, matrix, space = shortid.generate()) {
  debug('addSpace: ', space);
  return update(state, {
    spaces: { [space]: { $set: {
      objectIds: [],
      matrix
    } } }
  });
}
