# frozen_string_literal: true

require 'os'
require 'selenium-webdriver'
require 'xpath'
require 'rubyXL'
require 'irb'
require 'fileutils'
require 'binding_of_caller'
require 'pathname'
require 'pry'
require 'highline'
require 'csv'

require 'webdrone/version'
require 'webdrone/error'
require 'webdrone/browser'
require 'webdrone/open'
require 'webdrone/shot'
require 'webdrone/find'
require 'webdrone/clic'
require 'webdrone/exec'
require 'webdrone/mark'
require 'webdrone/form'
require 'webdrone/xlsx'
require 'webdrone/conf'
require 'webdrone/ctxt'
require 'webdrone/wait'
require 'webdrone/text'
require 'webdrone/vrfy'
require 'webdrone/html'
require 'webdrone/logg'
require 'webdrone/xpath'

module Webdrone
  class << self
    attr_accessor :running_pry, :irb_setup_done

    def create(*args, **kwargs)
      a0 = Webdrone::Browser.new(*args, **kwargs)
      if block_given?
        begin
          yield a0
        rescue StandardError => error
          Webdrone.report_error(a0, error)
        ensure
          a0.quit
        end
      else
        a0
      end
    end
  end

  def self.irb_console(binding = nil)
    puts 'Webdrone: Webdrone.irb_console IS DEPRECATED, please use a0.console instead.'
    return if IRB.CurrentContext && !binding

    binding ||= Kernel.binding.of_caller(1)
    IRB.start_session(binding)
  end

  Webdrone.running_pry = false
  def self.pry_console(binding = nil)
    if Webdrone.running_pry
      puts 'Webdrone: pry console already running.'
    else
      Webdrone.running_pry = true
      binding ||= Kernel.binding.of_caller(1)
      binding.pry
      Webdrone.running_pry = false
    end
  end
end

module IRB
  def self.start_session(binding)
    unless Webdrone.irb_setup_done
      IRB.setup(nil)
      Webdrone.irb_setup_done = true
    end

    workspace = WorkSpace.new(binding)

    irb = \
      if @CONF[:SCRIPT]
        Irb.new(workspace, @CONF[:SCRIPT])
      else
        Irb.new(workspace)
      end

    @CONF[:IRB_RC]&.call(irb.context)
    @CONF[:MAIN_CONTEXT] = irb.context

    trap('SIGINT') do
      irb.signal_handle
    end

    begin
      catch(:IRB_EXIT) do
        irb.eval_input
      end
    ensure
      IRB.irb_at_exit
    end
  end
end