import { ElementIDUtils } from '@sankhyalabs/core';
import { h } from '@stencil/core';
import { SnkFormConfigManager } from '../snk-form-config/SnkFormConfigManager';
import ResourceIDUtils from '../../lib/resourceid/ResourceIDUtils';
export class SnkForm {
  constructor() {
    this._customEditors = new Map();
    this._dataUnit = undefined;
    this._dataState = undefined;
    this._showFormConfig = false;
    this._configManager = undefined;
    this.configName = undefined;
    this.recordsValidator = undefined;
    this.messagesBuilder = undefined;
    this.formLegacyConfigName = undefined;
    this.resourceID = undefined;
  }
  /**
   * Exibe a janela de configurações do formulário.
   * @async
   * @returns {Promise<void>}
   */
  async showConfig() {
    this._showFormConfig = true;
  }
  /**
   * Fecha a janela de configurações do formulário.
   * @async
   * @returns {Promise<void>}
   */
  async hideConfig() {
    this._showFormConfig = false;
  }
  /**
   * Registra um editor customizado para campos do formulário.
   * @async
   * @param {string} fieldName - Nome do campo.
   * @param {ICustomEditor} customEditor - Editor customizado.
   * @returns {Promise<void>}
   */
  async addCustomEditor(fieldName, customEditor) {
    if (this._form) {
      this._form.addCustomEditor(fieldName, customEditor);
      return;
    }
    const newCustomEditors = new Map(this._customEditors);
    newCustomEditors.set(fieldName, customEditor);
    this._customEditors = newCustomEditors;
  }
  /**
   * Altera/adiciona uma propriedade nos metadados do campo.
   * @async
   * @param {string} fieldName - Nome do campo.
   * @param {string} propName - Nome da propriedade.
   * @param {any} value - Valor da propriedade.
   * @returns {Promise<void>}
   */
  async setFieldProp(fieldName, propName, value) {
    await this._form.setFieldProp(fieldName, propName, value);
  }
  /**
   * Valida o formulário.
   * @async
   * @returns {Promise<void>}
   * @description
   * Este método executa a validação do formulário, verificando se todos os campos estão
   * preenchidos corretamente de acordo com as regras definidas.
   * Se a validação falhar, uma exceção será lançada com os detalhes dos erros encontrados.
   * Caso contrário, o método será resolvido sem erros.
   */
  async validate() {
    await this._form.validate();
  }
  closeConfig() {
    this.hideConfig();
  }
  dataunitReady() {
    const dataInfo = { dataUnit: this._dataUnit };
    ElementIDUtils.addIDInfo(this._element, null, dataInfo);
  }
  setCustomEditors() {
    if (!this._form) {
      return;
    }
    for (const [fieldName, customEditor] of this._customEditors) {
      this._form.addCustomEditor(fieldName, customEditor);
      this._customEditors.delete(fieldName);
    }
  }
  async componentDidRender() {
    this.setCustomEditors();
  }
  async componentWillLoad() {
    let parent = this._element.parentElement;
    while (parent) {
      if (parent.tagName.toUpperCase() === "SNK-DATA-UNIT") {
        this._snkDataUnit = parent;
        this._dataUnit = this._snkDataUnit.dataUnit;
        this._dataState = this._snkDataUnit.dataState;
        if (this._dataUnit) {
          this.dataunitReady();
        }
        else {
          this._snkDataUnit.addEventListener("dataUnitReady", (evt) => {
            this._dataUnit = evt.detail;
          });
        }
        this._snkDataUnit.addEventListener("dataStateChange", this.handleDataStateChange.bind(this));
        break;
      }
      parent = parent.parentElement;
    }
    if (this.resourceID == undefined) {
      this.resourceID = await ResourceIDUtils.getResourceID();
    }
    this._configManager = new SnkFormConfigManager(this.configName, this.resourceID, undefined, this._dataUnit);
    this.addFormLegacyConfig();
    await this._configManager.loadConfig();
  }
  async handleDataStateChange(evt) {
    var _a;
    this._dataState = evt.detail;
    const fieldsWithRmPrecision = await this._snkDataUnit.getFieldsWithRmPrecision();
    for (const field of fieldsWithRmPrecision || []) {
      if (!field) {
        continue;
      }
      const rmPrecision = (_a = this._dataState.rowMetadata) === null || _a === void 0 ? void 0 : _a.getProp('rm_precision', field);
      if (!rmPrecision && rmPrecision !== 0) {
        continue;
      }
      await this.setFieldProp(field, 'precision', rmPrecision);
      await this.setFieldProp(field, 'prettyPrecision', rmPrecision);
    }
    ;
  }
  addFormLegacyConfig() {
    if (this.formLegacyConfigName) {
      this._configManager.addFormLegacyConfig(this.formLegacyConfigName);
    }
  }
  render() {
    if (!this._dataUnit || !this._dataState) {
      return undefined;
    }
    return (h("section", null, h("div", { class: "ez-row" }, h("div", { class: "ez-col ez-col--sd-12" }, h("ez-form", { ref: (ref) => this._form = ref, key: "ezForm" + this._snkDataUnit.entityName, "data-element-id": "embedded", dataUnit: this._dataUnit, config: this._configManager.getConfig(this._dataUnit), recordsValidator: this.recordsValidator, class: this._showFormConfig ? 'snk-form__form--hidden' : '' }), this._showFormConfig &&
      h("snk-form-config", { messagesBuilder: this.messagesBuilder, dataUnit: this._dataUnit, configManager: this._configManager, onConfigClose: () => this.closeConfig() })))));
  }
  static get is() { return "snk-form"; }
  static get encapsulation() { return "scoped"; }
  static get originalStyleUrls() {
    return {
      "$": ["snk-form.css"]
    };
  }
  static get styleUrls() {
    return {
      "$": ["snk-form.css"]
    };
  }
  static get properties() {
    return {
      "configName": {
        "type": "string",
        "mutable": false,
        "complexType": {
          "original": "string",
          "resolved": "string",
          "references": {}
        },
        "required": false,
        "optional": false,
        "docs": {
          "tags": [],
          "text": "Nome usado para guardar/recuperar as configura\u00E7\u00F5es do formul\u00E1rio."
        },
        "attribute": "config-name",
        "reflect": false
      },
      "recordsValidator": {
        "type": "unknown",
        "mutable": false,
        "complexType": {
          "original": "IRecordValidator",
          "resolved": "IRecordValidator",
          "references": {
            "IRecordValidator": {
              "location": "import",
              "path": "@sankhyalabs/ezui/dist/types/utils/form/interfaces"
            }
          }
        },
        "required": false,
        "optional": false,
        "docs": {
          "tags": [],
          "text": "Validador respons\u00E1vel por checar a integridade das informa\u00E7\u00F5es do registro."
        }
      },
      "messagesBuilder": {
        "type": "unknown",
        "mutable": true,
        "complexType": {
          "original": "SnkMessageBuilder",
          "resolved": "SnkMessageBuilder",
          "references": {
            "SnkMessageBuilder": {
              "location": "import",
              "path": "../../lib/message/SnkMessageBuilder"
            }
          }
        },
        "required": false,
        "optional": false,
        "docs": {
          "tags": [],
          "text": "Respons\u00E1vel por flexibilizar e padronizar o uso de mensagens nos blocos de constru\u00E7\u00E3o."
        }
      },
      "formLegacyConfigName": {
        "type": "string",
        "mutable": false,
        "complexType": {
          "original": "string",
          "resolved": "string",
          "references": {}
        },
        "required": false,
        "optional": false,
        "docs": {
          "tags": [],
          "text": "Chave da configura\u00E7\u00E3o legada do formul\u00E1rio."
        },
        "attribute": "form-legacy-config-name",
        "reflect": false
      },
      "resourceID": {
        "type": "string",
        "mutable": false,
        "complexType": {
          "original": "string",
          "resolved": "string",
          "references": {}
        },
        "required": false,
        "optional": false,
        "docs": {
          "tags": [],
          "text": "Identificador de recursos como configura\u00E7\u00F5es e acesso."
        },
        "attribute": "resource-i-d",
        "reflect": false
      }
    };
  }
  static get states() {
    return {
      "_dataUnit": {},
      "_dataState": {},
      "_showFormConfig": {},
      "_configManager": {}
    };
  }
  static get events() {
    return [{
        "method": "exit",
        "name": "exit",
        "bubbles": true,
        "cancelable": true,
        "composed": true,
        "docs": {
          "tags": [{
              "name": "deprecated",
              "text": "Esta propriedade foi descontinuada. Ela n\u00E3o tem mais efeito sobre o componente."
            }],
          "text": ""
        },
        "complexType": {
          "original": "void",
          "resolved": "void",
          "references": {}
        }
      }, {
        "method": "actionClick",
        "name": "actionClick",
        "bubbles": true,
        "cancelable": true,
        "composed": true,
        "docs": {
          "tags": [{
              "name": "deprecated",
              "text": "Esta propriedade foi descontinuada. Ela n\u00E3o tem mais efeito sobre o componente."
            }],
          "text": ""
        },
        "complexType": {
          "original": "string",
          "resolved": "string",
          "references": {}
        }
      }, {
        "method": "formItemsReady",
        "name": "formItemsReady",
        "bubbles": true,
        "cancelable": true,
        "composed": true,
        "docs": {
          "tags": [],
          "text": "Respons\u00E1vel por notificar quando ocorrer a renderiza\u00E7\u00E3o de itens do formul\u00E1rio.\nOBS: Emitido no subcomponente snk-form-view"
        },
        "complexType": {
          "original": "Array<HTMLElement>",
          "resolved": "HTMLElement[]",
          "references": {
            "Array": {
              "location": "global"
            },
            "HTMLElement": {
              "location": "global"
            }
          }
        }
      }];
  }
  static get methods() {
    return {
      "showConfig": {
        "complexType": {
          "signature": "() => Promise<void>",
          "parameters": [],
          "references": {
            "Promise": {
              "location": "global"
            }
          },
          "return": "Promise<void>"
        },
        "docs": {
          "text": "Exibe a janela de configura\u00E7\u00F5es do formul\u00E1rio.",
          "tags": [{
              "name": "async",
              "text": undefined
            }, {
              "name": "returns",
              "text": undefined
            }]
        }
      },
      "hideConfig": {
        "complexType": {
          "signature": "() => Promise<void>",
          "parameters": [],
          "references": {
            "Promise": {
              "location": "global"
            }
          },
          "return": "Promise<void>"
        },
        "docs": {
          "text": "Fecha a janela de configura\u00E7\u00F5es do formul\u00E1rio.",
          "tags": [{
              "name": "async",
              "text": undefined
            }, {
              "name": "returns",
              "text": undefined
            }]
        }
      },
      "addCustomEditor": {
        "complexType": {
          "signature": "(fieldName: string, customEditor: ICustomEditor) => Promise<void>",
          "parameters": [{
              "tags": [{
                  "name": "param",
                  "text": "fieldName - Nome do campo."
                }],
              "text": "- Nome do campo."
            }, {
              "tags": [{
                  "name": "param",
                  "text": "customEditor - Editor customizado."
                }],
              "text": "- Editor customizado."
            }],
          "references": {
            "Promise": {
              "location": "global"
            },
            "ICustomEditor": {
              "location": "import",
              "path": "@sankhyalabs/ezui/dist/types/utils"
            }
          },
          "return": "Promise<void>"
        },
        "docs": {
          "text": "Registra um editor customizado para campos do formul\u00E1rio.",
          "tags": [{
              "name": "async",
              "text": undefined
            }, {
              "name": "param",
              "text": "fieldName - Nome do campo."
            }, {
              "name": "param",
              "text": "customEditor - Editor customizado."
            }, {
              "name": "returns",
              "text": undefined
            }]
        }
      },
      "setFieldProp": {
        "complexType": {
          "signature": "(fieldName: string, propName: string, value: any) => Promise<void>",
          "parameters": [{
              "tags": [{
                  "name": "param",
                  "text": "fieldName - Nome do campo."
                }],
              "text": "- Nome do campo."
            }, {
              "tags": [{
                  "name": "param",
                  "text": "propName - Nome da propriedade."
                }],
              "text": "- Nome da propriedade."
            }, {
              "tags": [{
                  "name": "param",
                  "text": "value - Valor da propriedade."
                }],
              "text": "- Valor da propriedade."
            }],
          "references": {
            "Promise": {
              "location": "global"
            }
          },
          "return": "Promise<void>"
        },
        "docs": {
          "text": "Altera/adiciona uma propriedade nos metadados do campo.",
          "tags": [{
              "name": "async",
              "text": undefined
            }, {
              "name": "param",
              "text": "fieldName - Nome do campo."
            }, {
              "name": "param",
              "text": "propName - Nome da propriedade."
            }, {
              "name": "param",
              "text": "value - Valor da propriedade."
            }, {
              "name": "returns",
              "text": undefined
            }]
        }
      },
      "validate": {
        "complexType": {
          "signature": "() => Promise<void>",
          "parameters": [],
          "references": {
            "Promise": {
              "location": "global"
            }
          },
          "return": "Promise<void>"
        },
        "docs": {
          "text": "Valida o formul\u00E1rio.",
          "tags": [{
              "name": "async",
              "text": undefined
            }, {
              "name": "returns",
              "text": undefined
            }, {
              "name": "description",
              "text": "Este m\u00E9todo executa a valida\u00E7\u00E3o do formul\u00E1rio, verificando se todos os campos est\u00E3o \npreenchidos corretamente de acordo com as regras definidas.\nSe a valida\u00E7\u00E3o falhar, uma exce\u00E7\u00E3o ser\u00E1 lan\u00E7ada com os detalhes dos erros encontrados.\nCaso contr\u00E1rio, o m\u00E9todo ser\u00E1 resolvido sem erros."
            }]
        }
      }
    };
  }
  static get elementRef() { return "_element"; }
}
