import pytest

from tests.support.asserts import assert_error, assert_success
from tests.support.inline import inline


def element_click(session, element):
    return session.transport.send(
        "POST", "session/{session_id}/element/{element_id}/click".format(
            session_id=session.session_id,
            element_id=element.id))


def test_display_none(session):
    session.url = inline("""<button style="display: none">foobar</button>""")
    element = session.find.css("button", all=False)

    response = element_click(session, element)
    assert_error(response, "element not interactable")


def test_visibility_hidden(session):
    session.url = inline("""<button style="visibility: hidden">foobar</button>""")
    element = session.find.css("button", all=False)

    response = element_click(session, element)
    assert_error(response, "element not interactable")


def test_hidden(session):
    session.url = inline("<button hidden>foobar</button>")
    element = session.find.css("button", all=False)

    response = element_click(session, element)
    assert_error(response, "element not interactable")


def test_disabled(session):
    session.url = inline("""<button disabled>foobar</button>""")
    element = session.find.css("button", all=False)

    response = element_click(session, element)
    assert_success(response)


@pytest.mark.parametrize("transform", ["translate(-100px, -100px)", "rotate(50deg)"])
def test_element_not_interactable_css_transform(session, transform):
    session.url = inline("""
        <div style="width: 500px; height: 100px;
            background-color: blue; transform: {transform};">
            <input type=button>
        </div>""".format(transform=transform))
    element = session.find.css("input", all=False)
    response = element_click(session, element)
    assert_error(response, "element not interactable")


def test_element_not_interactable_out_of_view(session):
    session.url = inline("""
        <style>
        input {
          position: absolute;
          margin-top: -100vh;
          background: red;
        }
        </style>

        <input>
        """)
    element = session.find.css("input", all=False)
    response = element_click(session, element)
    assert_error(response, "element not interactable")


@pytest.mark.parametrize("tag_name", ["div", "span"])
def test_zero_sized_element(session, tag_name):
    session.url = inline("<{0}></{0}>".format(tag_name))
    element = session.find.css(tag_name, all=False)

    response = element_click(session, element)
    assert_error(response, "element not interactable")


def test_element_intercepted(session):
    session.url = inline("""
        <style>
        div {
          position: absolute;
          height: 100vh;
          width: 100vh;
          background: blue;
          top: 0;
          left: 0;
        }
        </style>

        <input type=button value=Roger>
        <div></div>
        """)
    element = session.find.css("input", all=False)
    response = element_click(session, element)
    assert_error(response, "element click intercepted")


def test_element_intercepted_no_pointer_events(session):
    session.url = inline("""<input type=button value=Roger style="pointer-events: none">""")
    element = session.find.css("input", all=False)
    response = element_click(session, element)
    assert_error(response, "element click intercepted")


def test_element_not_visible_overflow_hidden(session):
    session.url = inline("""
        <style>
        div {
          overflow: hidden;
          height: 50px;
          background: green;
        }

        input {
          margin-top: 100px;
          background: red;
        }
        </style>

        <div><input></div>
        """)
    element = session.find.css("input", all=False)
    response = element_click(session, element)
    assert_error(response, "element not interactable")
