import { format } from "date-fns";
// import {getRGBA} from '@verdocs/js-sdk';
import interact from "interactjs";
import AirDatepicker from "air-datepicker";
import localeEn from "air-datepicker/locale/en";
import { updateField, VerdocsEndpoint } from "@verdocs/js-sdk";
import { h, Host, Fragment } from "@stencil/core";
import { SettingsIcon } from "../../../utils/Icons";
import { FORMAT_DATE } from "../../../utils/Types";
import { Store } from "../../../utils/Datastore";
/**
 * Displays a date field. When tapped or clicked, the input element will display a date picker component.
 */
export class VerdocsFieldDate {
    constructor() {
        /**
         * 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 = '';
        /**
         * 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.containerId = `verdocs-date-picker-${Math.random().toString(36).substring(2, 11)}`;
        this.showingProperties = false;
        this.focused = false;
        this.picker = null;
    }
    handleBlur() {
        this.focused = false;
    }
    async focusField() {
        this.inputEl.focus();
        this.focused = true;
    }
    componentDidLoad() {
        const { source, sourceid, fieldname } = this;
        const { field } = Store.getField(source, sourceid, fieldname, this.field);
        const { readonly = false } = field || {};
        if (!readonly) {
            this.picker = new AirDatepicker(`#${this.containerId}`, {
                locale: localeEn,
                isMobile: true,
                autoClose: true,
                onShow: () => (this.focused = true),
                onHide: () => (this.focused = false),
                onSelect: ({ date, formattedDate }) => {
                    const event = new CustomEvent('fieldChange', { detail: { date, formattedDate } });
                    this.el.dispatchEvent(event);
                },
            });
        }
    }
    componentDidRender() {
        interact.dynamicDrop(true);
        if (this.editable) {
            interact(this.el).resizable({
                edges: {
                    top: '.edge-top',
                    left: '.edge-left',
                    bottom: '.edge-bottom',
                    right: '.edge-right',
                },
                modifiers: [
                    interact.modifiers.restrictSize({
                        min: { width: 50, height: 12 },
                    }),
                ],
                listeners: {
                    start: this.handleResizeStart.bind(this),
                    move: this.handleResize.bind(this),
                    end: this.handleResizeEnd.bind(this),
                },
            });
        }
    }
    handleResizeStart(e) {
        e.preventDefault();
        e.stopPropagation();
        e.target.dataset.originalBottom = e.target.style.bottom;
    }
    handleResize(e) {
        let { width, height } = e.rect;
        const dX = e.deltaRect.left;
        const dY = e.deltaRect.bottom;
        const currentLeft = parseFloat(e.target.style.left);
        const currentBottom = parseFloat(e.target.style.bottom);
        width /= this.xscale;
        height /= this.yscale;
        Object.assign(e.target.style, {
            width: `${width}px`,
            height: `${height}px`,
            left: `${currentLeft + dX}px`,
            bottom: `${currentBottom - dY}px`,
        });
    }
    async handleResizeEnd(e) {
        const { sourceid, fieldname } = this;
        const width = Math.round(parseFloat(e.target.style.width));
        let height = Math.round(parseFloat(e.target.style.height));
        if (height < 12) {
            height = 12;
        }
        const newBottom = parseFloat(e.target.style.bottom);
        const originalBottom = parseFloat(e.target.dataset.originalBottom);
        const template = await Store.getTemplate(VerdocsEndpoint.getDefault(), this.sourceid);
        const oldField = template.fields.find(f => f.name === fieldname);
        const y = newBottom !== originalBottom ? newBottom / this.yscale : oldField === null || oldField === void 0 ? void 0 : oldField.y;
        updateField(VerdocsEndpoint.getDefault(), sourceid, fieldname, { width, height, y })
            .then(async (updatedField) => {
            var _a;
            const template = await Store.getTemplate(VerdocsEndpoint.getDefault(), this.sourceid);
            const newTemplate = JSON.parse(JSON.stringify(template));
            const fieldIndex = newTemplate.fields.findIndex(field => field.name === fieldname);
            if (fieldIndex > -1) {
                newTemplate.fields[fieldIndex] = updatedField;
            }
            Store.updateTemplate(this.sourceid, newTemplate);
            (_a = this.settingsChanged) === null || _a === void 0 ? void 0 : _a.emit({ fieldName: fieldname, field: updatedField });
            Object.assign(e.target.dataset, { x: 0, y: 0, h: 0 });
        })
            .catch(e => console.log('Field update failed', e));
    }
    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();
        }
    }
    // NOTE: We don't use a "date" field here because browsers vary widely in their formatting of it.
    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 = 'Date...', value = '', label = '', readonly = false, height = 20, width = 74 } = field || {};
        const signerClass = `signer-${(index % 10) + 1}`;
        const small = height < 20 || width < 74;
        const formattedValue = value ? format(new Date(value), FORMAT_DATE) : '';
        if (this.done) {
            return h(Host, { class: { done } }, formattedValue);
        }
        return (h(Host, { class: { required, disabled, done, focused, small, [signerClass]: true } }, editable && h("div", { class: "edge-top" }), editable && h("div", { class: "edge-right" }), editable && h("div", { class: "edge-left" }), editable && h("div", { class: "edge-bottom" }), label && h("label", null, label), h("input", { name: fieldname, class: "input-el", type: "text", value: formattedValue, id: this.containerId, placeholder: placeholder, disabled: readonly || disabled, ref: el => (this.inputEl = el), onFocus: () => (this.focused = true), onBlur: () => (this.focused = false) }), 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-${field.name}`, 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: 'Date fields allow the user to select a date.' })))))));
    }
    static get is() { return "verdocs-field-date"; }
    static get originalStyleUrls() {
        return {
            "$": ["verdocs-field-date.scss"]
        };
    }
    static get styleUrls() {
        return {
            "$": ["verdocs-field-date.css"]
        };
    }
    static get properties() {
        return {
            "source": {
                "type": "string",
                "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,
                "attribute": "source",
                "defaultValue": "'template'"
            },
            "sourceid": {
                "type": "string",
                "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,
                "attribute": "sourceid",
                "defaultValue": "''"
            },
            "fieldname": {
                "type": "string",
                "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,
                "attribute": "fieldname",
                "defaultValue": "''"
            },
            "disabled": {
                "type": "boolean",
                "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,
                "attribute": "disabled",
                "defaultValue": "false"
            },
            "editable": {
                "type": "boolean",
                "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,
                "attribute": "editable",
                "defaultValue": "false"
            },
            "moveable": {
                "type": "boolean",
                "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,
                "attribute": "moveable",
                "defaultValue": "false"
            },
            "done": {
                "type": "boolean",
                "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,
                "attribute": "done",
                "defaultValue": "false"
            },
            "xscale": {
                "type": "number",
                "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,
                "attribute": "xscale",
                "defaultValue": "1"
            },
            "yscale": {
                "type": "number",
                "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,
                "attribute": "yscale",
                "defaultValue": "1"
            },
            "pagenumber": {
                "type": "number",
                "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,
                "attribute": "pagenumber",
                "defaultValue": "1"
            },
            "field": {
                "type": "unknown",
                "mutable": false,
                "complexType": {
                    "original": "ITemplateField",
                    "resolved": "ITemplateField",
                    "references": {
                        "ITemplateField": {
                            "location": "import",
                            "path": "@verdocs/js-sdk",
                            "id": "node_modules::ITemplateField"
                        }
                    }
                },
                "required": false,
                "optional": true,
                "docs": {
                    "tags": [],
                    "text": "If set, the field will be be scaled vertically by this factor."
                },
                "getter": false,
                "setter": false
            }
        };
    }
    static get states() {
        return {
            "containerId": {},
            "showingProperties": {},
            "focused": {}
        };
    }
    static get events() {
        return [{
                "method": "settingsPress",
                "name": "settingsPress",
                "bubbles": true,
                "cancelable": true,
                "composed": true,
                "docs": {
                    "tags": [],
                    "text": "Event fired on every character entered into / deleted from the field."
                },
                "complexType": {
                    "original": "any",
                    "resolved": "any",
                    "references": {}
                }
            }, {
                "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"; }
    static get listeners() {
        return [{
                "name": "blur",
                "method": "handleBlur",
                "target": undefined,
                "capture": true,
                "passive": false
            }];
    }
}
//# sourceMappingURL=verdocs-field-date.js.map
