<?php
/*
** Copyright (C) 2001-2025 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/

/**
 * Trait for objects that can be casted to web elements.
 */
trait CastableTrait {

	/**
	 * Cast object to base Element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CElement
	 */
	public function asElement($options = []) {
		return $this->cast(CElement::class, $options);
	}

	/**
	 * Cast object to Checkbox element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CCheckboxElement
	 */
	public function asCheckbox($options = []) {
		return $this->cast(CCheckboxElement::class, $options);
	}

	/**
	 * Cast object to CheckboxList element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CCheckboxElement
	 */
	public function asCheckboxList($options = []) {
		return $this->cast(CCheckboxListElement::class, $options);
	}

	/**
	 * Cast object to Dashboard element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CDashboardElement
	 */
	public function asDashboard($options = []) {
		return $this->cast(CDashboardElement::class, $options);
	}

	/**
	 * Cast object to List element.
	 *
	 * @deprecated List element is present only in IPMI tab of host configuration form.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CListElement
	 */
	public function asList($options = []) {
		return $this->cast(CListElement::class, $options);
	}

	/**
	 * Cast object to Dropdown element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CDropdownElement
	 */
	public function asDropdown($options = []) {
		return $this->cast(CDropdownElement::class, $options);
	}

	/**
	 * Cast object to Form element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CFormElement
	 */
	public function asForm($options = []) {
		return $this->cast(CFormElement::class, $options);
	}

	/**
	 * Cast object to Grid form element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CGridFormElement
	 */
	public function asGridForm($options = []) {
		return $this->cast(CGridFormElement::class, $options);
	}

	/**
	 * Cast object to CheckboxForm element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CFormElement
	 */
	public function asCheckboxForm($options = []) {
		return $this->cast(CCheckboxFormElement::class, $options);
	}

	/**
	 * Cast object to Message element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CMessageElement
	 */
	public function asMessage($options = []) {
		return $this->cast(CMessageElement::class, $options);
	}

	/**
	 * Cast object to Multiselect element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CMultiselectElement
	 */
	public function asMultiselect($options = []) {
		return $this->cast(CMultiselectElement::class, $options);
	}

	/**
	 * Cast object to OverlayDialog element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return COverlayDialogElement
	 */
	public function asOverlayDialog($options = []) {
		return $this->cast(COverlayDialogElement::class, $options);
	}

	/**
	 * Cast object to Table element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CTableElement
	 */
	public function asTable($options = []) {
		return $this->cast(CTableElement::class, $options);
	}

	/**
	 * Cast object to TableRow element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CTableRowElement
	 */
	public function asTableRow($options = []) {
		return $this->cast(CTableRowElement::class, $options);
	}

	/**
	 * Cast object to Widget element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CWidgetElement
	 */
	public function asWidget($options = []) {
		return $this->cast(CWidgetElement::class, $options);
	}

	/**
	 * Cast object to SegmentedRadio element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CSegmentedRadioElement
	 */
	public function asSegmentedRadio($options = []) {
		return $this->cast(CSegmentedRadioElement::class, $options);
	}

	/**
	 * Cast object to CompositeInput element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CCompositeInputElement
	 */
	public function asCompositeInput($options = []) {
		return $this->cast(CCompositeInputElement::class, $options);
	}

	/**
	 * Cast object to ColorPicker element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CColorPickerElement
	 */
	public function asColorPicker($options = []) {
		return $this->cast(CColorPickerElement::class, $options);
	}

	/**
	 * Cast object to MultifieldTable element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CMultifieldTableElement
	 */
	public function asMultifieldTable($options = []) {
		return $this->cast(CMultifieldTableElement::class, $options);
	}

	/**
	 * Cast object to PopupMenu element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CPopupMenuElement
	 */
	public function asPopupMenu($options = []) {
		return $this->cast(CPopupMenuElement::class, $options);
	}

	/**
	 * Cast object to base RemoteWebElement.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return RemoteWebElement
	 */
	public function asBaseType($options = []) {
		return $this->cast(RemoteWebElement::class, $options);
	}

	/**
	 * Cast object to Multiline element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CMultilineElement
	 */
	public function asMultiline($options = []) {
		return $this->cast(CMultilineElement::class, $options);
	}

	/**
	 * Cast object to PopupButton element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CPopupButtonElement
	 */
	public function asPopupButton($options = []) {
		return $this->cast(CPopupButtonElement::class, $options);
	}

	/**
	 * Cast object to InputGroup element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CInputGroupElement
	 */
	public function asInputGroup($options = []) {
		return $this->cast(CInputGroupElement::class, $options);
	}

	/**
	 * Cast object to Interface element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CHostInterfaceElement
	 */
	public function asHostInterfaceElement($options = []) {
		return $this->cast(CHostInterfaceElement::class, $options);
	}

	/**
	 * Cast object to Filter element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CFilterElement
	 */
	public function asFilterElement($options = []) {
		return $this->cast(CFilterElement::class, $options);
	}

	/**
	 * Cast object to MainMenu element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CMainMenuElement
	 */
	public function asMainMenu($options = []) {
		return $this->cast(CMainMenuElement::class, $options);
	}

	/**
	 * Cast object to Fieldset element.
	 *
	 * @param array $options    additional casting options
	 *
	 * @return CFieldsetElement
	 */
	public function asFieldset($options = []) {
		return $this->cast(CFieldsetElement::class, $options);
	}
}