class IDRAC::Client

def authenticated_request(method, path, options = {})

def authenticated_request(method, path, options = {})
  login unless @session_id
  
  options[:headers] ||= {}
  options[:headers]['Cookie'] = "sessionid=#{@session_id}"
  
  response = connection.send(method, path, options[:params]) do |req|
    req.headers.merge!(options[:headers])
    req.body = options[:body] if options[:body]
  end
  
  response
end

def base_url

def base_url
  protocol = use_ssl ? 'https' : 'http'
  "#{protocol}://#{host}:#{port}"
end

def connection

def connection
  @connection ||= Faraday.new(url: base_url, ssl: { verify: verify_ssl }) do |faraday|
    faraday.request :multipart
    faraday.request :url_encoded
    faraday.adapter Faraday.default_adapter
  end
end

def get(path:, headers: {})

def get(path:, headers: {})
  response = HTTParty.get(
    "#{base_url}/#{path}",
    headers: {
      "User-Agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
      "Accept-Encoding" => "deflate, gzip",
      "Cookie" => @cookies
    }.merge(headers),
    verify: false
  )
end

def initialize(host:, username:, password:, port: 443, use_ssl: true, verify_ssl: true)

def initialize(host:, username:, password:, port: 443, use_ssl: true, verify_ssl: true)
  @host = host
  @username = username
  @password = password
  @port = port
  @use_ssl = use_ssl
  @verify_ssl = verify_ssl
  @session_id = nil
  @cookies = nil
end

def login

def login
  response = connection.post('/data/login') do |req|
    req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
    req.body = "user=#{username}&password=#{password}"
  end
  if response.status == 200
    # Extract session ID from response
    doc = Nokogiri::HTML(response.body)
    @session_id = doc.at_css('script:contains("_this.SID")').text.match(/_this\.SID\s*=\s*"([^"]+)"/)[1] rescue nil
    
    # Store cookies for screenshot functionality
    @cookies = response.headers['set-cookie']
    
    # Extract forward URL for screenshot functionality
    xml_doc = Nokogiri::XML(response.body)
    error_message = xml_doc.at_xpath('//errorMsg')&.text
    
    if error_message && !error_message.empty?
      raise Error, "Error Message: #{error_message}"
    end
    
    forward_url = xml_doc.xpath('//forwardUrl').text
    return forward_url
  else
    raise Error, "Login failed with status #{response.status}: #{response.body}"
  end
end

def logout

def logout
  return unless @session_id
  
  response = connection.get('/data/logout') do |req|
    req.headers['Cookie'] = "sessionid=#{@session_id}"
  end
  
  @session_id = nil
  @cookies = nil
  response.status == 200
end

def screenshot

def screenshot
  # Create a Screenshot instance and capture a screenshot
  screenshot_instance = Screenshot.new(self)
  screenshot_instance.capture
end