import { sync } from "../scrapbox-watchlist-sync/script.ts";

sync({ project: "takker-dist" });

import { setDebugMode } from "jsr:@takker/debug-js@0.1";
setDebugMode(true);
import { addGyazoMenu } from "../Gyazoにuploadした画像URLをコピペするPage Menu@2.0.0/mod.ts";
import { GYAZO_ACCESS_TOKEN } from"../../takker-memex/GYAZO_ACCESS_TOKEN/auth.js";

addGyazoMenu({
  maxCount: 10,
  accessToken: GYAZO_ACCESS_TOKEN,
  onClick: async (image, e) => {
    try {
      if (e.ctrlKey) {
        await navigator.clipboard.writeText(image.permalink_url);
        return;
      }
      const cursor = document.getElementById("text-input");
      if (!cursor) {
        throw Error("#text-input is not ditected.");
      }
      cursor.focus();
      cursor.value = image.permalink_url;
      const event = new InputEvent("input", { bubbles: true });
      cursor.dispatchEvent(event);
      await scrapbox.Page.waitForSave();
    } catch(error) {
      alert(`${error}`);
      console.error(error);
    }
  },
});


import { setup as setupSearch } from "../takker99%2Fscrapbox-incremental-fulltext-search/mod.tsx";

setupSearch().then((ops) => {
  scrapbox.PageMenu.addItem({
    title: "Fulltext Search",
    onClick: () => {
      ops.toggle();
    },
  });
});

import { scrapBindings } from "./bindings.ts";
export { scrapBindings };
import "./scrapBubble.ts";
import {
  setup as setupJupyter
} from "../@takker%2FScrapJupyter/mod.ts";
import { findLatestCache, saveApiCache } from "../scrapbox-userscript-std/dom.ts";

// v0.24.0
const WASM_URL = "https://scrapbox.io/files/67344295032adf96d1e4c276.wasm";
const WORKER_URL = "/api/code/takker-dist/for-any-project-min/esbuild-worker.js";

(async () => {
  const req = new Request(WASM_URL);
  let res = await findLatestCache(req);
  if (!res) {
    res = await fetch(req);
    await saveApiCache(req, res);
  }
  await setupJupyter(
    await WebAssembly.compileStreaming(res),
    WORKER_URL,
  );
})();

import { setup as setupSelectSuggestion } from "../選択範囲に似ているリンクを入力補完するUserScript/mod.tsx";
import { addTextInputEventListener } from "../scrapbox-userscript-std/dom.ts";
import { Scrapbox } from "../scrapbox-jp%2Ftypes/userscript.ts";
declare const scrapbox: Scrapbox;

(async () => {

 const projects = [
  scrapbox.Project.name,
  "takker", "takker-memex", "takker-books", "takker-private",
  "villagepump", "hub", "arpla", "work4ai",
  "unnamedcamp", "unnamed-project",
  "nishio", "enchi", "rashitamemo", "motoso",
  "shokai", "masui", "rakusai", "yuiseki", "akiroom",
  "c4j", "miyamonz", "mrsekut-p", "masuilab",
  "kidaaam-92022284", "nwtgck", "juneboku",
  "marshmallow-rm", "sushitecture", "sno2wman", "inteltank",
  "issac-37765679", "blu3mo", "yosider", "Mijinko", "Mijinko-other",
  "scrapbox-drinkup", "nota-techconf",
  "customize", "scrapboxlab", "scrasobox", "programming-notes",
  "tus-alpine", "tus-alpine-private",
  "guiland", "evergreens", "fab-wiki",
];

const ops = await setupSelectSuggestion({
  projects,
  mark: {
    ...Object.fromEntries(
      [
        ["takker", "takker"],
        ["takker-memex", "takker"],
        ["takker-books", "takker-books"],
        ["takker-private", "takker-private"],
        ["nishio", "nishio"],
        ["rashitamemo", "rashita"],
        ["enchi", "雑談_2022-04-12~"],
        ["rakusai", "rakusai"],
        ["masui", "概要"],
        ["shokai", "shokai"],
        ["yuiseki", "yuiseki"],
        ["akiroom", "はじめに"],
        ["inteltank", "sawachin"],
        ["motoso", "もとそのもと"],
        ["villagepump", "井戸端"],
        ["hub", "scrapbox.io%2Fhub_について"],
        ["masuilab", "増井研に入ったらまずやること"],
        ["marshmallow-rm", "読書猿マシュマロ全質問回答"],
        ["miyamonz", "miyamonz"],
        ["mrsekut-p", "mrsekut"],
        ["kidaaam-92022284", "kidooom"],
        ["c4j", "Code_for_Japan"],
        ["suto3", "suto3"],
        ["blu3mo", "blu3mo"],
        ["nwtgck", "nwtgck"],
        ["juneboku", "juneboku"],
        ["jigsaw", "jgs"],
        ["sno2wman", "SnO2WMaN"],
        ["sushitecture", "hashrock"],
        ["unnamedcamp", "知を営む"],
        ["unnamed-project", "unnamed-project"],
        ["issac-37765679", "cFQ2f7LRuLYP"],
        ["blu3mo", "blu3mo"],
        ["yosider", "yosider"],
        ["Mijinko", "Mijinko_SD"],
        ["Mijinko-other", "Mijinko_SD"],
        ["customize", "みんなのカスタマイズ"],
        ["scrapboxlab", "入会手続き"],
        ["scrasobox", "Scrapboxとあそぶ"],
        ["programming-notes", "参加する"],
        ["guiland", "概要と参加方法"],
        ["work4ai", "work4ai"],
        ["evergreens", "HOME"],
        ["fab-wiki", "fab-wikiに参加する"],
      ].map(([p, t]) => [p, `https://scrapbox.io/api/pages/${p}/${t}/icon`])
    ),
    "NDLSH-SB": "📚",
    "scrapbox-drinkup": "https://scrapbox.io/assets/img/page-icon/scrapbox_beaver.png",
    "nota-techconf": "https://i.gyazo.com/727f42bbd9e2534d99d70e6ea90705b3.jpg",
    "plurality-japanese": "⿻",
  },
  enableSelfProjectOnStart: true,
});

const pvsp = (e: Event): void => {
  e.preventDefault();
  e.stopPropagation();
};
const hasPopup = (): boolean => document.querySelector(".line .popup-menu") !== null;
scrapBindings.bind({
  "<Tab>":   (e) => { if(hasPopup()) return; if(!ops.selectNext?.({ cyclic: true })) return; pvsp(e); },
  "<S-Tab>": (e) => { if(hasPopup()) return; if(!ops.selectPrev?.({ cyclic: true })) return; pvsp(e); },
  "<Enter>": (e) => { if(hasPopup()) return; if(!ops.confirm?.()) return; pvsp(e); },
  "<Esc>":   (e) => { if(hasPopup()) return; if(!ops.cancel?.()) return; pvsp(e); },
});
})();

import { setup as setUpRun, previewSVG, previewGLSL, previewPlantUML, previewTikZ } from "../ScrapRun/mod.ts";

setUpRun({ previewers: [
  { when: /(?:^|\.)svg$/, preview: previewSVG },
  { when: /(?:^|\.)glsl$/, preview: previewGLSL },
  { when: /(?:^|\.)(?:plantuml|puml|pu)$/, preview: previewPlantUML },
  { when: /(?:^|\.)tikz\(tex\)$/, preview: previewTikZ(
    "/api/code/takker-dist/for-any-project-min/tex-worker.js",
    "https://scrapbox.io/files/65d1645c19cd8e002433c3df",
  ) },
]});

import { isMobile } from "../mobile版scrapboxの判定/script.js";
  
import "../popup/script.ts";
import { main } from "../takker99%2Ftakker-scheduler/auto-review.ts";

main(
  "takker",
  ["takker", "振り返り(takker-workflow@0.0.1)のtemplate", "txt"],
  ["takker", "1週間の振り返り(takker-workflow@0.0.1)のtemplate", "txt"],
  new Date(2024, 11, 24),
);

import "./sheet.ts";
import { addButton } from "../Porterっぽい編集バーを生やすUserScript@1.0.0/mod.ts";
import {
  porterCopy, porterCut, porterPaste, toggleCaret
} from "../Porterっぽい編集バーを生やすUserScript@1.0.0/commands.ts";
import {
  downBlocks,
  downLines,
  indentBlocks,
  indentLines,
  insertText,
  outdentBlocks,
  outdentLines,
  upBlocks,
  upLines,
  redo,
  undo,
} from "../scrapbox-userscript-std/dom.ts";

if (isMobile()) {
  addButton({
    display: { type: "caret-left" },
    onClick: ({ cursor, selection }) => {
      cursor.focus();
      selection.getSelectedText() === "" ? outdentBlocks() : outdentLines();
    },
  });
  addButton({
    display: { type: "caret-right" },
    onClick: ({ cursor, selection }) => {
      cursor.focus();
      selection.getSelectedText() === "" ? indentBlocks() : indentLines();
    },
  });
  addButton({
    display: { type: "caret-up" },
    onClick: ({ cursor, selection }) => {
      cursor.focus();
      selection.getSelectedText() === "" ? upBlocks() : upLines();
    },
  });
  addButton({
    display: { type: "caret-down" },
    onClick: ({ cursor, selection }) => {
      cursor.focus();
      selection.getSelectedText() === "" ? downBlocks() : downLines()
    },
  });
  addButton({
    display: { type: "copy" },
    onClick: async ({ cursor, selection }) => await porterCopy(cursor, selection),
  });
  addButton({
    display: { type: "cut" },
    onClick: async ({ cursor, selection }) => await porterCut(cursor, selection),
  });
  addButton({
    display: { type: "clipboard" },
    onClick: async ({ cursor }) => await porterPaste(cursor),
  });
  addButton({
    display: { type: "undo" },
    onClick: () => undo(),
  });
  addButton({
    display: { type: "redo" },
    onClick: () => redo(),
  });
  addButton({
    display: ({ cursor }) => cursor.getVisible() && cursor.hasFocus
     // @ts-ignore private扱いだけど、これしかアクセス方法がないため使わせていただく
     && cursor.visiblePopupMenu ?
      { type: ["i-cursor", "slash"] } :
      { type: "i-cursor" },
    onClick: ({ cursor }) => toggleCaret(cursor),
  });
}

import "../scrapbox-editor-begin-edit/script.ts";
import "../mobileからtimestampを行頭に挿入するUserScript/script.js";
import "../Kakeruを開くPage_Menu/script.js";
import "../作業時間を🍅でリアルタイムに表示するUserScript/main.ts";
import {
  transport, createTask,
} from "../takker99%2Ftakker-scheduler/deps.ts";

if (isMobile() && scrapbox.Project.name !== "takker-memex") {
  const id = "task";
  scrapbox.PageMenu.addMenu({
    title: id,
    image: 'https://img.icons8.com/ios/180/FFFFFF/todo-list--v2.png',
  });
  scrapbox.PageMenu(id).addItem({
    title: 'Book starting',
    image: 'https://img.icons8.com/ios/180/FFFFFF/plus-1day.png',
    onClick: createTask,
  });
  scrapbox.PageMenu(id).addItem({
    title: 'Transport',
    onClick: () => transport({
      from: {
        project: scrapbox.Project.name,
        title: scrapbox.Page.title!,
      },
      to: "takker-memex",
    }),
  });
}

import { makeNewPage } from "../custom-new-page/mod.ts";
import {
  newPageHook,
  splittedLinkHook,
  taskLineHook,
} from "../for-custom-new-page/mod.ts";

if (isMobile()) {
  const id = "New Page";
  const hooks = [taskLineHook, newPageHook, splittedLinkHook];
  scrapbox.PageMenu.addMenu({
    title: id,
    image: "https://img.icons8.com/ios/180/FFFFFF/cut-paper.png",
  });
  scrapbox.PageMenu(id).addItem({
    title: "New Page",
    onClick: () => {
      const project = window.prompt("Create a new page at", scrapbox.Project.name);
      if (!project) return;
      makeNewPage({ project, mode: "noopen", hooks })?.();
    },
  });
  scrapbox.PageMenu(id).addItem({
    title: "New Page and Open",
    onClick: () => {
      const project = window.prompt("Create a new page at", scrapbox.Project.name);
      if (!project) return;
      makeNewPage({ project, mode: "self", hooks })?.();
    },
  });
}

import "../ページを転送するUserScript/pageMenu.ts";
import "../scrapbox-icon-button/script.js";
import "../Markdown形式でページのURLをコピーするPageMenu/script.js";
import "../現在行をタスクリンクにするPageMenu/script.ts";

import {
  setup as setupActions
} from "../takker99%2Ftakker-scheduler/viewer.tsx";
import {
  setup as setupScheduler,
  setupWedget
} from "../takker99%2Ftakker-scheduler/weekly-scheduler.tsx";

(async () => {
  const id = "next-action";
  const selector = `head style[data-userscript-name="${id}"]`;
  document.querySelector(selector)?.remove?.();
  const style = document.createElement("style");
  style.dataset.userscriptName = id;
  style.textContent = `
button:is(#${id}, #scheduler).tool-btn::before {
  position: absolute;
  font: 900 20px/46px "Font Awesome 5 Free";
}
button#${id}.tool-btn::before {
  content: "\\f0ae";
}
button#scheduler.tool-btn::before {
  content: "\\f073";
  font-weight: 400;
}
button:is(#${id}, #scheduler).tool-btn img {
  opacity: 0;
}`;
  document.head.append(style);
  const projects = ["takker-memex", "takker"];
  const { open } = await setupActions(projects);
  scrapbox.PageMenu.addMenu({
    title: id,
    image: "/assets/img/favicon/apple-touch-icon.png",
    onClick: open,
  });
  const scheduler = await setupScheduler(projects);
  scrapbox.PageMenu.addMenu({
    title: "scheduler",
    image: "/assets/img/favicon/apple-touch-icon.png",
    onClick: scheduler.open,
  });
  {
    const key = "takker-scheduler/wedget";
    let settings = JSON.parse(localStorage.getItem(key) ?? "{}");
    const project = scrapbox.Project.name;
    settings[project] ??= false;
    const wedget = await setupWedget(projects, settings[project]);
    const toggle = () => {
      settings[project] = !wedget.isOpen;
      if (wedget.isOpen) { wedget.close(); } else { wedget.open?.(); }
      localStorage.setItem(key, JSON.stringify(settings));
    };
    if (!isMobile()) {
      scrapbox.PageMenu.addItem({
        title: "toggle wedget",
        onClick: toggle,
      });
    } else {
      addButton({
        display: { type: "calendar" },
        onClick: toggle,
      });
    }
  }
})();

export { addButton, insertText,  };