import React from "../_snowpack/pkg/react.js";
import {Controlled as CodeMirror2} from "../_snowpack/pkg/react-codemirror2.js";
import "../_snowpack/pkg/codemirror/mode/javascript/javascript.js";
import "../_snowpack/pkg/codemirror/mode/pegjs/pegjs.js";
import "../_snowpack/pkg/codemirror/lib/codemirror.css.proxy.js";
import "../_snowpack/pkg/codemirror/theme/material.css.proxy.js";
export default function CodeMirror({value, onChange, onCursor, options, editorDidMount}) {
  options = options || {
    mode: "javascript",
    theme: "material",
    lineNumbers: true,
    styleSelectedText: true,
    cursorBlinkRate: 500
  };
  return /* @__PURE__ */ React.createElement(CodeMirror2, {
    value,
    options,
    onBeforeChange: onChange,
    editorDidMount,
    onCursor: (editor, data) => onCursor?.(editor, data)
  });
}
export const markEvent = (editor) => (time, event) => {
  const locs = event.context.locations;
  if (!locs || !editor) {
    return;
  }
  const marks = locs.map(({start, end}) => editor.getDoc().markText({line: start.line - 1, ch: start.column}, {line: end.line - 1, ch: end.column}, {css: "outline: 1px solid #FFCA28; box-sizing:border-box"}));
  setTimeout(() => {
    marks.forEach((mark) => mark.clear());
  }, event.duration * 1e3);
};
let parenMark;
export const markParens = (editor, data) => {
  const v = editor.getDoc().getValue();
  const marked = getCurrentParenArea(v, data);
  parenMark?.clear();
  parenMark = editor.getDoc().markText(...marked, {css: "background-color: #00007720"});
};
export function offsetToPosition(offset, code) {
  const lines = code.split("\n");
  let line = 0;
  let ch = 0;
  for (let i = 0; i < offset; i++) {
    if (ch === lines[line].length) {
      line++;
      ch = 0;
    } else {
      ch++;
    }
  }
  return {line, ch};
}
export function positionToOffset(position, code) {
  const lines = code.split("\n");
  let offset = 0;
  for (let i = 0; i < position.line; i++) {
    offset += lines[i].length + 1;
  }
  offset += position.ch;
  return offset;
}
export function getCurrentParenArea(code, caretPosition) {
  const caret = positionToOffset(caretPosition, code);
  let open, i, begin, end;
  i = caret;
  open = 0;
  while (i > 0) {
    if (code[i - 1] === "(") {
      open--;
    } else if (code[i - 1] === ")") {
      open++;
    }
    if (open === -1) {
      break;
    }
    i--;
  }
  begin = i;
  i = caret;
  open = 0;
  while (i < code.length) {
    if (code[i] === "(") {
      open--;
    } else if (code[i] === ")") {
      open++;
    }
    if (open === 1) {
      break;
    }
    i++;
  }
  end = i;
  return [begin, end].map((o) => offsetToPosition(o, code));
}
