class ButtonComponent extends HTMLElement {
	/**
	 * Parameters
	 *  - btnClasses: Additional classes to add to the block.
	 *  - element: The element to use for the button. Defaults to 'a'.
	 *  - url: The URL to link to.
	 *  - target: The target for the link.
	 *  - title: The text to display on the button.
	 *  - ariaLabel: The ARIA label for the button.
	 *  - color: The color of the button.
	 *  - variant: The variant of the button.
	 *  - size: The size of the button.
	 *  - width: The width of the button.
	 *
	 */

	connectedCallback() {
		if (!this.querySelector(this.getAttribute('element'))) {
			this.append(document.createElement(this.getAttribute('element')));
		}

		this.update();
	}

	static get observedAttributes() {
		return [
			'btnClasses',
			'el',
			'element',
			'type',
			'url',
			'target',
			'title',
			'ariaLabel',
			'color',
			'variant',
			'size',
			'width',
		]
	}

	attributeChangedCallback() {
		this.update();
	}

	update() {
		const btn = this.querySelector(this.getAttribute('element'));

		// console.log('[ButtonComponent] attributes', {
		//   btnClasses: this.getAttribute('btnClasses'),
		//   element: this.getAttribute('element'),
		//   type: this.getAttribute('type'),
		//   url: this.getAttribute('url'),
		//   target: this.getAttribute('target'),
		//   title: this.getAttribute('title'),
		//   ariaLabel: this.getAttribute('ariaLabel'),
		//   color: this.getAttribute('color'),
		//   variant: this.getAttribute('variant'),
		//   size: this.getAttribute('size'),
		//   width: this.getAttribute('width'),
		// });

		if (btn) {
			btn.classList = this.getAttribute('btnClasses') || '';

			if (this.getAttribute('element') == 'a') {
				btn.href = this.getAttribute('url') || '#';

				if (btn.target) {
					btn.target = 'target="${this.getAttribute(target)}"';
				}
			}

			const type = this.getAttribute('type');
			if (type && this.getAttribute('element') !== 'a') {
				btn.type = type;
			}

			btn.title        = this.getAttribute('title') || '';
			btn.textContent  = this.getAttribute('title') || '';

			if (!this.getAttribute('ariaLabel') && this.getAttribute('url')) {
				btn.setAttribute('aria-label', `Link to ${this.getAttribute('url')}`);
			} else {
				btn.setAttribute('aria-label', this.getAttribute('ariaLabel'));
			}

			btn.setAttribute('aria-label',          this.getAttribute('ariaLabel'));
			btn.setAttribute('data-button-color',   this.getAttribute('color'));
			btn.setAttribute('data-button-variant', this.getAttribute('variant'));
			btn.setAttribute('data-button-size',    this.getAttribute('size'));
			btn.setAttribute('data-button-width',   this.getAttribute('width'));
		}
	}
}

export const registerButtonComponent = () => {
	customElements.define('x-button', ButtonComponent);
}
