from lettuce import world, steps
from nose.tools import assert_in, assert_equals, assert_true

from common import i_am_registered_for_the_course, visit_scenario_item
from problems_setup import add_problem_to_course, answer_problem


DEFAULT_DATA = """\
<render>
    <p>Test of the graphical slider tool</p>
    <div class='gst-value'>
        <span id="value-display" style="width:50px; float:left; margin-left:10px;"/>
    </div>
    <div class='gst-input'>
        <slider var="a" style="width:400px;float:left;margin-left:10px;"/>
    </div>
</render>
<configuration>
    <parameters>
        <param var="a" min="0" max="10" step="1" initial="0"/>
    </parameters>
    <functions>
        <function output="element" el_id="value-display">a</function>
    </functions>
</configuration>
"""


@steps
class GraphicalSliderToolSteps(object):
    COURSE_NUM = 'test_course'

    def setup_gst(self, step):
        r'that I have a course with a Graphical Slider Tool$'

        i_am_registered_for_the_course(step, self.COURSE_NUM)

        world.scenario_dict['GST'] = world.ItemFactory(
            parent_location=world.scenario_dict['SECTION'].location,
            category='graphical_slider_tool',
            display_name="Test GST",
            data=DEFAULT_DATA
        )

    def view_gst(self, step):
        r'I view the Graphical Slider Tool$'
        visit_scenario_item('GST')
        world.wait_for_js_variable_truthy('$(".xblock-student_view[data-type=GraphicalSliderTool]").data("initialized")')
        world.wait_for_ajax_complete()

    def check_value(self, step, value):
        r'the displayed value should be (?P<value>\d+)$'

        assert_equals(world.css_text('.gst-value'), value)

    def move_slider(self, step):
        r'I move the slider to the right$'

        handle_selector = '.gst-input .ui-slider-handle'
        world.wait_for_visible(handle_selector)
        world.wait_for_visible('.gst-value #value-display')

        def try_move():
            handle = world.css_find(handle_selector).first
            slider = world.css_find('.gst-input .ui-slider').first
            (handle.action_chains
                .click_and_hold(handle._element)
                .move_by_offset(
                    int(handle._element.location['x'] + 400),
                    0
                ).release().perform())

        world.retry_on_exception(try_move)


GraphicalSliderToolSteps()