# frozen_string_literal: true

class AlignLogin < AutomationFramework::Utilities
  attr_accessor :token
  include Capybara::DSL

  # def app
  #   @app ||= AutomationFramework::Application.instance
  # end

  def get_logged_in_bearer_token
    align_cookie = Capybara.current_session.driver.browser.manage.cookie_named('align')[:value]
    align_sig = Capybara.current_session.driver.browser.manage.cookie_named('align.sig')[:value]
    url = URI("#{ENV.fetch('TOPICS_URL')}/auth/token")

    http = Net::HTTP.new(url.host, url.port)
    http.use_ssl = (url.scheme == 'https')
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    request = Net::HTTP::Post.new(url)
    request['Cookie'] = "align=#{align_cookie}; align.sig=#{align_sig}"
    response = http.request(request)
    JSON.parse(response.body)['accessToken']
  end

  def login(user, app_url = url)
    logout
    visit(app_url)
    find('#usernameField').set(username(user))
    find('button[id=nextButton]').click
    has_css?('#usernameField')
    has_css?('#passwordField', wait: 1)
    find('#passwordField').set(password)
    find('#signInButton').click
    has_css?('.user-name', wait: 5)
    set_token(user)
  end

  def login_headless(user)
    set_headless_browser
    login(user)
  end

  def logout
    visit("#{url}/logout")
    Capybara.current_session.driver.browser.manage.delete_all_cookies
  end

  def password(user = 'TOPICS')
    ENV.fetch(user.upcase + '_PASSWORD')
  end

  def re_enter_username?(user)
    return if page.find('input[id=usernameField]').value == username(user)

    fill_in 'usernameField', with: username(user)
  end

  def set_headless_browser(screen_width = (ENV['SCREEN_WIDTH'] || '1600'),
                           screen_height = (ENV['SCREEN_HEIGHT'] || '1200'))
    Capybara.register_driver :selenium_chrome_headless do |app|
      o = Selenium::WebDriver::Chrome::Options
          .new(args: ['--headless', '--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage',
                      '--incognito', '--disable-notifications',
                      "--window-size=#{screen_width},#{screen_height}"])
      Capybara::Selenium::Driver.new(app, browser: :chrome, options: o)
    end
    Capybara.current_driver = :selenium_chrome_headless
  end

  def set_token(user)
    if token.is_a?(Hash)
      token[user] = get_logged_in_bearer_token
    else
      self.token = { user => get_logged_in_bearer_token }
    end
  end

  def user_token(user)
    if token.nil? || token.key?(user) == false
      login_headless(user)
    elsif JWT.decode(token[user], nil, false)[0]['exp'] > (Time.now + 60).to_i
      token[user] = token[user]
    else
      login_headless(user)
    end
    token[user]
  end

  def url(app = 'TOPICS')
    ENV.fetch(app.upcase + '_URL')
  end

  def username(user)
    ENV.fetch(user.upcase + '_USERNAME')
  end
end