<?php

namespace Facebook\WebDriver;

/**
 * Interface for an HTML element in the WebDriver framework.
 */
interface WebDriverElement extends WebDriverSearchContext
{
    /**
     * If this element is a TEXTAREA or text INPUT element, this will clear the value.
     *
     * @return WebDriverElement The current instance.
     */
    public function clear();

    /**
     * Click this element.
     *
     * @return WebDriverElement The current instance.
     */
    public function click();

    /**
     * Get the value of the given attribute of the element.
     * Attribute is meant what is declared in the HTML markup of the element.
     * To read a value of a IDL "JavaScript" property (like `innerHTML`), use `getDomProperty()` method.
     *
     * @param string $attribute_name The name of the attribute.
     * @return string|null The value of the attribute.
     */
    public function getAttribute($attribute_name);

    /*
     * Gets the value of a IDL JavaScript property of this element (for example `innerHTML`, `tagName` etc.).
     *
     * @see https://developer.mozilla.org/en-US/docs/Glossary/IDL
     * @see https://developer.mozilla.org/en-US/docs/Web/API/Element#properties
     * @param string $propertyName
     * @return string|null The property's current value or null if the value is not set or the property does not exist.
     * @todo Add in next major release (BC)
     */
    // public function getDomProperty($propertyName);

    /**
     * Get the value of a given CSS property.
     *
     * @param string $css_property_name The name of the CSS property.
     * @return string The value of the CSS property.
     */
    public function getCSSValue($css_property_name);

    /**
     * Get the location of element relative to the top-left corner of the page.
     *
     * @return WebDriverPoint The location of the element.
     */
    public function getLocation();

    /**
     * Try scrolling the element into the view port and return the location of
     * element relative to the top-left corner of the page afterwards.
     *
     * @return WebDriverPoint The location of the element.
     */
    public function getLocationOnScreenOnceScrolledIntoView();

    /**
     * Get the size of element.
     *
     * @return WebDriverDimension The dimension of the element.
     */
    public function getSize();

    /**
     * Get the tag name of this element.
     *
     * @return string The tag name.
     */
    public function getTagName();

    /**
     * Get the visible (i.e. not hidden by CSS) innerText of this element,
     * including sub-elements, without any leading or trailing whitespace.
     *
     * @return string The visible innerText of this element.
     */
    public function getText();

    /**
     * Is this element displayed or not? This method avoids the problem of having
     * to parse an element's "style" attribute.
     *
     * @return bool
     */
    public function isDisplayed();

    /**
     * Is the element currently enabled or not? This will generally return true
     * for everything but disabled input elements.
     *
     * @return bool
     */
    public function isEnabled();

    /**
     * Determine whether or not this element is selected or not.
     *
     * @return bool
     */
    public function isSelected();

    /**
     * Simulate typing into an element, which may set its value.
     *
     * @param mixed $value The data to be typed.
     * @return WebDriverElement The current instance.
     */
    public function sendKeys($value);

    /**
     * If this current element is a form, or an element within a form, then this
     * will be submitted to the remote server.
     *
     * @return WebDriverElement The current instance.
     */
    public function submit();

    /**
     * Get the opaque ID of the element.
     *
     * @return string The opaque ID.
     */
    public function getID();

    /**
     * Take screenshot of a specific element.
     *
     * @param string $save_as The path of the screenshot to be saved.
     * @return string The screenshot in PNG format.
     * @todo Add in next major release (BC)
     */
    //public function takeElementScreenshot($save_as = null);
}