import interact from "interactjs";
import { VerdocsEndpoint } from "@verdocs/js-sdk";
import { updateField, getRGBA } from "@verdocs/js-sdk";
import { h, Host, Fragment } from "@stencil/core";
import { SettingsIcon } from "../../../utils/Icons";
import { Store } from "../../../utils/Datastore";
/**
 * Display a multi-line text input field. Reminder: the "position" of the field is specified
 * as the BOTTOM-LEFT corner.
 */
export class VerdocsFieldTextarea {
    constructor() {
        /**
         * The endpoint to use to communicate with Verdocs. If not set, the default endpoint will be used.
         * This component self-manages its resize (width) behavior when in edit-template mode, and uses
         * this endpoint to save changes.
         */
        this.endpoint = VerdocsEndpoint.getDefault();
        /**
         * Fields may be attached to templates or envelopes, but only template fields may be edited.
         */
        this.source = 'template';
        /**
         * The source template or envelope ID the field is found in.
         */
        this.sourceid = '';
        /**
         * The name of the field to display.
         */
        this.fieldname = '';
        /**
         * Override the field's settings. This is intended to be used during signing when fields are being
         * mutated.
         */
        this.field = null;
        /**
         * If set, overrides the field's settings object. Primarily used to support "preview" modes where all fields are disabled.
         */
        this.disabled = false;
        /**
         * If set, a settings icon will be displayed on hover. The settings shown allow the field's recipient and other settings to be
         * changed, so it should typically only be enabled in the Builder.
         */
        this.editable = false;
        /**
         * If set, the field may be dragged to a new location. This should only be enabled in the Builder, or for self-placed fields.
         */
        this.moveable = false;
        /**
         * If set, the field is considered "done" and is drawn in a display-final-value state.
         */
        this.done = false;
        /**
         * If set, the field will be be scaled horizontally by this factor.
         */
        this.xscale = 1;
        /**
         * If set, the field will be be scaled vertically by this factor.
         */
        this.yscale = 1;
        /**
         * The page the field is on
         */
        this.pagenumber = 1;
        this.showingProperties = false;
        this.focused = false;
    }
    async focusField() {
        this.inputEl.focus();
    }
    async showSettingsPanel() {
        const settingsPanel = document.getElementById(`verdocs-settings-panel-${this.fieldname}`);
        if (settingsPanel && settingsPanel.showPanel) {
            settingsPanel.showPanel();
        }
    }
    async hideSettingsPanel() {
        const settingsPanel = document.getElementById(`verdocs-settings-panel-${this.fieldname}`);
        if (settingsPanel && settingsPanel.hidePanel) {
            settingsPanel.hidePanel();
        }
    }
    componentDidRender() {
        interact.dynamicDrop(true);
        if (this.editable) {
            interact(this.el).resizable({
                edges: { top: true, bottom: true, left: true, right: true },
                listeners: {
                    start: this.handleResizeStart.bind(this),
                    move: this.handleResize.bind(this),
                    end: this.handleResizeEnd.bind(this),
                },
            });
        }
    }
    handleResizeStart(e) {
        e.preventDefault();
        e.stopPropagation();
    }
    handleResize(e) {
        let { x = 0, y = 0, h = 0 } = e.target.dataset;
        let { width, height } = e.rect;
        x = (parseFloat(x) || 0) + e.deltaRect.left;
        y = (parseFloat(y) || 0) + e.deltaRect.top;
        h = (parseFloat(h) || 0) + e.deltaRect.height;
        Object.assign(e.target.style, {
            width: `${width}px`,
            height: `${height}px`,
            transform: `translate(${x}px, ${y + h}px)`,
        });
        Object.assign(e.target.dataset, { x, y, h });
    }
    handleResizeEnd(e) {
        const { source, sourceid, fieldname } = this;
        const { field } = Store.getField(source, sourceid, fieldname, this.field);
        if (!field) {
            return;
        }
        const [translateX, translateY] = e.target.style.transform.split('(')[1].split(')')[0].split(',').map(parseFloat);
        const width = Math.round(parseFloat(e.target.style.width) / this.xscale);
        const height = Math.round(parseFloat(e.target.style.height) / this.yscale);
        const x = Math.round(field.x + translateX / this.xscale);
        const y = Math.round(field.y - translateY / this.yscale);
        updateField(this.endpoint, this.sourceid, this.fieldname, { x, y, width, height })
            .then(field => {
            var _a;
            (_a = this.settingsChanged) === null || _a === void 0 ? void 0 : _a.emit({ fieldName: this.fieldname, field });
            Object.assign(e.target.dataset, { x: 0, y: 0, h: 0 });
        })
            .catch(e => console.log('Field update failed', e));
    }
    render() {
        const { source, sourceid, fieldname, editable = false, done = false, disabled = false, focused, xscale = 1, yscale = 1 } = this;
        const { index, field } = Store.getField(source, sourceid, fieldname, this.field);
        const { required = false, placeholder = '', value = '', label = '' } = field || {};
        const backgroundColor = getRGBA(index);
        if (done) {
            return h(Host, { class: { done } }, value);
        }
        return (h(Host, { class: { required, disabled, done, focused }, style: { backgroundColor } }, label && h("label", null, label), h("textarea", { name: fieldname, disabled: disabled, required: required, placeholder: placeholder, ref: el => (this.inputEl = el), onFocus: () => (this.focused = true), onBlur: () => (this.focused = false) }, value), editable && (h(Fragment, null, h("div", { id: `verdocs-settings-panel-trigger-${fieldname}`, style: { transform: `scale(${Math.floor((1 / xscale) * 1000) / 1000}, ${Math.floor((1 / yscale) * 1000) / 1000})` }, class: "settings-icon", innerHTML: SettingsIcon, onClick: (e) => {
                e.stopPropagation();
                this.showingProperties = !this.showingProperties;
            } }), this.showingProperties && (h("verdocs-portal", { anchor: `verdocs-settings-panel-trigger-${fieldname}`, onClickAway: () => (this.showingProperties = false) }, h("verdocs-template-field-properties", { templateId: sourceid, fieldName: fieldname, onClose: () => (this.showingProperties = false), onDelete: () => {
                var _a;
                (_a = this.deleted) === null || _a === void 0 ? void 0 : _a.emit({ fieldName: fieldname });
                return this.hideSettingsPanel();
            }, onSettingsChanged: e => {
                var _a;
                (_a = this.settingsChanged) === null || _a === void 0 ? void 0 : _a.emit(e.detail);
                return this.hideSettingsPanel();
            }, helpText: 'Text areas may be used to create multi-line text fields.' })))))));
    }
    static get is() { return "verdocs-field-textarea"; }
    static get originalStyleUrls() {
        return {
            "$": ["verdocs-field-textarea.scss"]
        };
    }
    static get styleUrls() {
        return {
            "$": ["verdocs-field-textarea.css"]
        };
    }
    static get properties() {
        return {
            "endpoint": {
                "type": "unknown",
                "attribute": "endpoint",
                "mutable": false,
                "complexType": {
                    "original": "VerdocsEndpoint",
                    "resolved": "VerdocsEndpoint",
                    "references": {
                        "VerdocsEndpoint": {
                            "location": "import",
                            "path": "@verdocs/js-sdk",
                            "id": "node_modules::VerdocsEndpoint"
                        }
                    }
                },
                "required": false,
                "optional": false,
                "docs": {
                    "tags": [],
                    "text": "The endpoint to use to communicate with Verdocs. If not set, the default endpoint will be used.\nThis component self-manages its resize (width) behavior when in edit-template mode, and uses\nthis endpoint to save changes."
                },
                "getter": false,
                "setter": false,
                "defaultValue": "VerdocsEndpoint.getDefault()"
            },
            "source": {
                "type": "string",
                "attribute": "source",
                "mutable": false,
                "complexType": {
                    "original": "'template' | 'envelope'",
                    "resolved": "\"envelope\" | \"template\"",
                    "references": {}
                },
                "required": false,
                "optional": false,
                "docs": {
                    "tags": [],
                    "text": "Fields may be attached to templates or envelopes, but only template fields may be edited."
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "'template'"
            },
            "sourceid": {
                "type": "string",
                "attribute": "sourceid",
                "mutable": false,
                "complexType": {
                    "original": "string",
                    "resolved": "string",
                    "references": {}
                },
                "required": false,
                "optional": false,
                "docs": {
                    "tags": [],
                    "text": "The source template or envelope ID the field is found in."
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "''"
            },
            "fieldname": {
                "type": "string",
                "attribute": "fieldname",
                "mutable": false,
                "complexType": {
                    "original": "string",
                    "resolved": "string",
                    "references": {}
                },
                "required": false,
                "optional": false,
                "docs": {
                    "tags": [],
                    "text": "The name of the field to display."
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "''"
            },
            "field": {
                "type": "unknown",
                "attribute": "field",
                "mutable": false,
                "complexType": {
                    "original": "IEnvelopeField | null | undefined",
                    "resolved": "IEnvelopeField",
                    "references": {
                        "IEnvelopeField": {
                            "location": "import",
                            "path": "@verdocs/js-sdk",
                            "id": "node_modules::IEnvelopeField"
                        }
                    }
                },
                "required": false,
                "optional": false,
                "docs": {
                    "tags": [],
                    "text": "Override the field's settings. This is intended to be used during signing when fields are being\nmutated."
                },
                "getter": false,
                "setter": false,
                "defaultValue": "null"
            },
            "disabled": {
                "type": "boolean",
                "attribute": "disabled",
                "mutable": false,
                "complexType": {
                    "original": "boolean",
                    "resolved": "boolean",
                    "references": {}
                },
                "required": false,
                "optional": true,
                "docs": {
                    "tags": [],
                    "text": "If set, overrides the field's settings object. Primarily used to support \"preview\" modes where all fields are disabled."
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "false"
            },
            "editable": {
                "type": "boolean",
                "attribute": "editable",
                "mutable": false,
                "complexType": {
                    "original": "boolean",
                    "resolved": "boolean",
                    "references": {}
                },
                "required": false,
                "optional": true,
                "docs": {
                    "tags": [],
                    "text": "If set, a settings icon will be displayed on hover. The settings shown allow the field's recipient and other settings to be\nchanged, so it should typically only be enabled in the Builder."
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "false"
            },
            "moveable": {
                "type": "boolean",
                "attribute": "moveable",
                "mutable": false,
                "complexType": {
                    "original": "boolean",
                    "resolved": "boolean",
                    "references": {}
                },
                "required": false,
                "optional": true,
                "docs": {
                    "tags": [],
                    "text": "If set, the field may be dragged to a new location. This should only be enabled in the Builder, or for self-placed fields."
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "false"
            },
            "done": {
                "type": "boolean",
                "attribute": "done",
                "mutable": false,
                "complexType": {
                    "original": "boolean",
                    "resolved": "boolean",
                    "references": {}
                },
                "required": false,
                "optional": true,
                "docs": {
                    "tags": [],
                    "text": "If set, the field is considered \"done\" and is drawn in a display-final-value state."
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "false"
            },
            "xscale": {
                "type": "number",
                "attribute": "xscale",
                "mutable": false,
                "complexType": {
                    "original": "number",
                    "resolved": "number",
                    "references": {}
                },
                "required": false,
                "optional": true,
                "docs": {
                    "tags": [],
                    "text": "If set, the field will be be scaled horizontally by this factor."
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "1"
            },
            "yscale": {
                "type": "number",
                "attribute": "yscale",
                "mutable": false,
                "complexType": {
                    "original": "number",
                    "resolved": "number",
                    "references": {}
                },
                "required": false,
                "optional": true,
                "docs": {
                    "tags": [],
                    "text": "If set, the field will be be scaled vertically by this factor."
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "1"
            },
            "pagenumber": {
                "type": "number",
                "attribute": "pagenumber",
                "mutable": false,
                "complexType": {
                    "original": "number",
                    "resolved": "number",
                    "references": {}
                },
                "required": false,
                "optional": true,
                "docs": {
                    "tags": [],
                    "text": "The page the field is on"
                },
                "getter": false,
                "setter": false,
                "reflect": true,
                "defaultValue": "1"
            }
        };
    }
    static get states() {
        return {
            "showingProperties": {},
            "focused": {}
        };
    }
    static get events() {
        return [{
                "method": "settingsChanged",
                "name": "settingsChanged",
                "bubbles": true,
                "cancelable": true,
                "composed": true,
                "docs": {
                    "tags": [],
                    "text": "Event fired when the field's settings are changed."
                },
                "complexType": {
                    "original": "{fieldName: string; field: ITemplateField}",
                    "resolved": "{ fieldName: string; field: ITemplateField; }",
                    "references": {
                        "ITemplateField": {
                            "location": "import",
                            "path": "@verdocs/js-sdk",
                            "id": "node_modules::ITemplateField"
                        }
                    }
                }
            }, {
                "method": "deleted",
                "name": "deleted",
                "bubbles": true,
                "cancelable": true,
                "composed": true,
                "docs": {
                    "tags": [],
                    "text": "Event fired when the field is deleted."
                },
                "complexType": {
                    "original": "{fieldName: string}",
                    "resolved": "{ fieldName: string; }",
                    "references": {}
                }
            }];
    }
    static get methods() {
        return {
            "focusField": {
                "complexType": {
                    "signature": "() => Promise<void>",
                    "parameters": [],
                    "references": {
                        "Promise": {
                            "location": "global",
                            "id": "global::Promise"
                        }
                    },
                    "return": "Promise<void>"
                },
                "docs": {
                    "text": "",
                    "tags": []
                }
            },
            "showSettingsPanel": {
                "complexType": {
                    "signature": "() => Promise<void>",
                    "parameters": [],
                    "references": {
                        "Promise": {
                            "location": "global",
                            "id": "global::Promise"
                        }
                    },
                    "return": "Promise<void>"
                },
                "docs": {
                    "text": "",
                    "tags": []
                }
            },
            "hideSettingsPanel": {
                "complexType": {
                    "signature": "() => Promise<void>",
                    "parameters": [],
                    "references": {
                        "Promise": {
                            "location": "global",
                            "id": "global::Promise"
                        }
                    },
                    "return": "Promise<void>"
                },
                "docs": {
                    "text": "",
                    "tags": []
                }
            }
        };
    }
    static get elementRef() { return "el"; }
}
//# sourceMappingURL=verdocs-field-textarea.js.map
