import { listen } from "rkgk/framework.js";

export class ResizeHandle extends HTMLElement {
    constructor() {
        super();
    }

    connectedCallback() {
        this.direction = this.getAttribute("data-direction");
        this.targetId = this.getAttribute("data-target");
        this.target = document.getElementById(this.targetId);
        this.targetProperty = this.getAttribute("data-target-property");
        this.initSize = parseInt(this.getAttribute("data-init-size"));
        this.minSize = parseInt(this.getAttribute("data-min-size"));

        this.#setSize(parseInt(localStorage.getItem(this.#localStorageKey)));
        this.#saveSize();
        this.#updateTargetProperty();

        this.visual = this.appendChild(document.createElement("div"));
        this.visual.classList.add("visual");

        this.#draggingBehaviour();
    }

    #setSize(newSize) {
        if (newSize != newSize) {
            newSize = this.initSize;
        }
        this.size = Math.max(this.minSize, newSize);
    }

    get #localStorageKey() {
        return `rkgk.resizeHandle.size.${this.targetId}`;
    }

    #saveSize() {
        localStorage.setItem(this.#localStorageKey, this.size);
    }

    #updateTargetProperty() {
        this.target.style.setProperty(this.targetProperty, `${this.size}px`);
    }

    async #draggingBehaviour() {
        while (true) {
            let mouseDown = await listen([this, "mousedown"]);
            let startingSize = this.size;
            if (mouseDown.button == 0) {
                mouseDown.preventDefault();
                this.classList.add("dragging");

                while (true) {
                    let event = await listen([window, "mousemove"], [window, "mouseup"]);
                    if (event.type == "mousemove") {
                        if (this.direction == "vertical") {
                            this.#setSize(startingSize + (mouseDown.clientX - event.clientX));
                        }
                        this.#updateTargetProperty();
                    } else if (event.type == "mouseup") {
                        this.classList.remove("dragging");
                        this.#saveSize();
                        break;
                    }
                }
            }
        }
    }
}

customElements.define("rkgk-resize-handle", ResizeHandle);
