// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html

import { fabric } from "fabric";
import { get } from "svelte/store";

import type { Callback } from "@tslib/helpers";
import { opacityStateStore } from "../store";
import {
    enableUniformScaling,
    isPointerInBoundingBox,
    stopDraw,
    TEXT_BACKGROUND_COLOR,
    TEXT_FONT_FAMILY,
    TEXT_PADDING,
} from "./lib";
import { undoStack } from "./tool-undo-redo";
import { onPinchZoom } from "./tool-zoom";

export const drawText = (canvas: fabric.Canvas, onActivated: Callback): void => {
    canvas.selectionColor = "rgba(0, 0, 0, 0)";
    stopDraw(canvas);

    let text: fabric.IText;

    canvas.on("mouse:down", function(o) {
        if (o.target) {
            return;
        }
        const pointer = canvas.getPointer(o.e);

        if (!isPointerInBoundingBox(pointer)) {
            return;
        }

        text = new fabric.IText("text", {
            left: pointer.x,
            top: pointer.y,
            originX: "left",
            originY: "top",
            selectable: true,
            strokeWidth: 1,
            noScaleCache: false,
            fontFamily: TEXT_FONT_FAMILY,
            backgroundColor: TEXT_BACKGROUND_COLOR,
            padding: TEXT_PADDING,
            opacity: get(opacityStateStore) ? 0.4 : 1,
            lineHeight: 1,
            lockScalingFlip: true,
        });
        text["id"] = "text-" + new Date().getTime();

        enableUniformScaling(canvas, text);
        canvas.add(text);
        canvas.setActiveObject(text);
        undoStack.onObjectAdded(text.id);
        text.enterEditing();
        text.selectAll();
        onActivated();
    });

    canvas.on("mouse:move", function(o) {
        if (onPinchZoom(o)) {
            canvas.remove(text);
            canvas.renderAll();
            return;
        }
    });
};
