class Screen

takeScreenshot: (screenshotName) ->
  $.delay 0.5
  orientation = switch app.interfaceOrientation()
    when 0 then 'Unknown'
    when 1 then 'Portrait'
    when 2 then 'PortraitUpsideDown'
    when 3 then 'LandscapeLeft'
    when 4 then 'LandscapeRight'
    when 5 then 'FaceUp'
    when 6 then 'FaceDown'
  $.log "Screenshot of screen '#{@name}' taken with orientation '#{orientation}'"
  target.captureScreenWithName(screenshotName)

element: (name) ->
  finder = @elements[name] || -> $('#' + name)

  unless el = wait finder
    raise "Element '#{name}' was not found on '#{@name}'"
  el

constructor: (@name) ->

elements: {}
actions:
  'Take a screenshot$': -> @takeScreenshot(@name)

  'Take a screenshot named "([^"]*)"$': (name) -> @takeScreenshot(name)

  'Show elements' : -> view.logElementTree()

  'Show elements for "([^"]*)"$': (name) -> @element(name).logElementTree()

  'Tap "([^"]*)"$': (name) -> @element(name).tap()

  'Confirm "([^"]*)"$': (element) -> @actions['Tap "([^"]*)"$'].bind(this)(element)

  'Wait for "([^"]*)" second[s]*$': (seconds) -> target.delay(seconds)

  'Type "([^"]*)" in the "([^"]*)" field$': (text, name) ->
    $(@element(name)).input(text)

  'Clear the "([^"]*)" field$': (name) -> @element(name).setValue ''

  'Cancel the alert$' : ->
    alert = app.alert()
    raise "No alert found to dismiss on screen '#{@name}'" unless alert.isValid()
    alert.cancelButton().tap()

  'Confirm the alert$' : ->
    alert = app.alert()
    raise "No alert found to dismiss on screen '#{@name}'" unless alert.isValid()
    alert.defaultButton().tap()

  'Select the date "([^"]*)"$' : (dateString) ->
    datePicker = view.pickers()[0]
    raise "No date picker available to enter the date #{dateString}" unless datePicker.isValid() and datePicker.isVisible()
    dateParts = dateString.match(/^(\d{2}) (\D*) (\d{4})$/)
    raise "Date is in the wrong format. Need DD Month YYYY. Got #{dateString}" unless dateParts?
    # Set Day
    view.pickers()[0].wheels()[0].selectValue(dateParts[1])
    # Set Month
    counter = 0
    monthWheel = view.pickers()[0].wheels()[1]
    while monthWheel.value() != dateParts[2] and counter<12
        counter++
        monthWheel.tapWithOptions({tapOffset:{x:0.5, y:0.33}})
        target.delay(0.4)
    raise "Couldn't find the month #{dateParts[2]}" unless counter < 12
    # Set Year
    view.pickers()[0].wheels()[2].selectValue(dateParts[3])

  'Rotate device to "([^"]*)"$': (orientation) -> rotateTo(orientation)