class Android < Base
  RESOURCE_ID = 'resource-id'
  CONTENT_DESC = 'content-desc'
  TEXT = 'text'
  ID = { java: :id }
  XPATH = { java: :xpath }
  CLASS = 'class'

  attr_accessor :platform, :udid

  def initialize(options)
    self.platform = options.platform
    self.udid = options.udid
  end

  def skeletoner
    log.info('We starting to skeleton your screen 🚀')
    create_page_objects
    save_screenshot
    save(code: page_source)
    log.info('We successfully skeletoned your screen 👻')
  end

  private

  def create_locator_by_resouce_id(line)
    method_name = line[RESOURCE_ID]
    method_name.slice!(/.*id\//)
    code_generation(method_name: method_name,
                    locator_type: ID,
                    value: line[RESOURCE_ID])
  end

  def create_locator_by_content_desc(line)
    method_name = "#{line[CLASS]}#{increment_locator_id}"
    method_name.slice!(/.*\./)
    locator = "//#{line[CLASS]}[@#{CONTENT_DESC}='#{line[CONTENT_DESC]}']"
    code_generation(method_name: method_name,
                    locator_type: XPATH,
                    value: locator)
  end

  def create_locator_by_text(line)
    method_name = "#{line[CLASS]}#{increment_locator_id}"
    method_name.slice!(/.*\./)
    locator = "//#{line[CLASS]}[@#{TEXT}='#{line[TEXT]}'"
    code_generation(method_name: method_name,
                    locator_type: XPATH,
                    value: locator)
  end

  def create_locator(line)
    if !line[RESOURCE_ID].empty?
      create_locator_by_resouce_id(line)
    elsif !line[CONTENT_DESC].empty?
      create_locator_by_content_desc(line)
    elsif !line[TEXT].empty?
      create_locator_by_text(line)
    end
  end

  def create_page_objects
    log.info('Generation page objects for your awesome language 💪')
    page_source_html = Nokogiri::HTML.parse(page_source)
    page_source_html.css('node').each { |line| create_locator(line) }
  end

  def code_generation(method_name:, locator_type:, value:)
    java = java(method_name, locator_type, value)
    save(code: java, format: Language::JAVA)
  end

  def page_source
    unless @page_source
      log.info('Getting screen source tree âš’')
      dump = `adb -s #{@udid} shell uiautomator dump | egrep -o '/.*?xml'`
      @page_source = `adb -s #{@udid} shell cat #{dump}`
      if @page_source.empty?
        log.fatal('Something went wrong. Check your device')
        Process.exit(1)
      end
      log.info('Successfully getting Screen Source Tree 🔥')
    end
    @page_source
  end

  def save_screenshot
    log.info('Saving screenshot 📷')
    file_name = "#{@platform}_#{TIMESTAMP}.png"
    `adb -s #{@udid} shell screencap -p /sdcard/#{file_name}`
    `adb -s #{@udid} pull /sdcard/#{file_name} #{ATTACHMENTS_FOLDER}/`
    `adb -s #{@udid} shell rm /sdcard/#{file_name}`
  end
end