import paper from 'paper';

import { toolState } from './tools/state';
import {
  updatePaintColor,
  decrementBrush,
  incrementBrush,
  cycleBrushHead,
} from './brush';
import { colors } from './colors';
import { saveMapToFile, encodeMap } from './save';
import { loadMapFromFile } from './load';
import { toolCategoryDefinition } from './tools';
import { showMainMenu, mainMenu } from './ui/mainMenu';
import { showHelpMenu, helpMenu } from './ui/help';
import { toggleGrid } from './grid';
import { redo, undo, state } from './state';
import { toggleScreenshotVisible } from './ui/screenshotOverlay';
import { modals } from './ui/modal';

export const keys = {
  isSpaceDown: false,
};

const keyDownMap = {};

export function onKeyUp(event) {
  switch (event.key) {
    case 'space':
      keys.isSpaceDown = false;
      break;
    case '`':
      toggleScreenshotVisible();
      delete keyDownMap['`'];
      break;
  }
}

export function onKeyDown(event) {
  const shift = paper.Key.isDown('shift');
  const control = paper.Key.isDown('control') || paper.Key.isDown('meta');

  const prevActiveTool = toolState.activeTool;
  switch (event.key) {
    case 'space':
      keys.isSpaceDown = true;
      break;
    case '1':
      updatePaintColor(colors.sand);
      break;
    case '2':
      updatePaintColor(colors.rock);
      break;
    case '3':
      updatePaintColor(colors.level1);
      break;
    case '4':
      updatePaintColor(colors.level2);
      break;
    case '5':
      updatePaintColor(colors.level3);
      break;
    case '6':
      updatePaintColor(colors.water);
      break;
    /*    case 'q':
        changePaintTool(paintTools.grid);
        break;
      case 'w':
        changePaintTool(paintTools.diagonals);
        break;
      case 'e':
        changePaintTool(paintTools.freeform);
        break; */
    case 's':
      if (control) {
        saveMapToFile();
        event.preventDefault();
      }
      break;
    case 'o':
      if (control) {
        loadMapFromFile();
        event.preventDefault();
      }
      break;
    case '[':
    case '{':
      decrementBrush();
      break;
    case ']':
    case '}':
      incrementBrush();
      break;
    case 'p':
      cycleBrushHead();
      break;
    //      case 'v':
    //        toolState.switchToolType(toolCategoryDefinition.pointer.type);
    //        break;
    case 'b':
      toolState.switchToolType(toolCategoryDefinition.terrain.type);
      break;
    case 'n':
      toolState.switchToolType(toolCategoryDefinition.path.type);
      break;
    case 'm':
      toolState.switchToolType(toolCategoryDefinition.structures.type);
      break;
    case ',':
      toolState.switchToolType(toolCategoryDefinition.amenities.type);
      break;
    case 'backspace':
    case 'delete':
      toolState.deleteSelection();
      break;
    case 'escape':
      var isMainMenuShown = mainMenu && mainMenu.data.isShown();
      if (isMainMenuShown) {
        showMainMenu(false);
      } else {
        var otherModalShown = false;
          modals.forEach(function (modal) {
            if (modal != mainMenu && modal.data.isShown()) {
              modal.data.show(false);
              otherModalShown = true;
            }
          });
          if (!otherModalShown)
            showMainMenu(true);
      }
      break;
    case '?':
      var isHelpMenuShown = helpMenu && helpMenu.data.isShown();
      showHelpMenu(!isHelpMenuShown);
      break;
    case '\\':
      toggleGrid();
      break;
    case '/':
      console.log(encodeMap());
      navigator.clipboard.writeText(encodeMap());
      break;
    case 'z':
      if (control && shift) {
        redo();
      } else if (control) {
        undo();
      }
      break;
    case 'y':
      if (control) {
        redo();
        event.preventDefault();
      }
      break;

    // temp
    //    case 'u':
    //      tracemap.opacity = Math.min(1, tracemap.opacity + 0.2);
    //      break;
    //    case 'h':
    //      tracemap.visible = !tracemap.visible;
    //      break;
    //    case 'j':
    //      tracemap.opacity = Math.max(0, tracemap.opacity -0.2);
    //      break;
    case 'k':
      Object.values(state.drawing).forEach((path) => {
        path.selected = !path.selected;
      });
      break;
    case '`':
      if (!keyDownMap['`'])
        toggleScreenshotVisible();
      keyDownMap['`'] = true;
      break;
  }
  if (prevActiveTool === toolState.activeTool) {
    toolState.activeTool.definition.onKeyDown(event);
  }
}