class IDRAC::Client

def create_redfish_session

Create a Redfish session
def create_redfish_session
  # Skip if we're in direct mode
  if @direct_mode
    puts "Skipping Redfish session creation (direct mode)"
    return false
  end
  
  url = '/redfish/v1/SessionService/Sessions'
  payload = { "UserName" => username, "Password" => password }
  
  # Try first with just Content-Type header (no Basic Auth)
  begin
    response = connection.post(url) do |req|
      req.headers['Content-Type'] = 'application/json'
      req.body = payload.to_json
    end
    
    if response.status == 201 || response.status == 200
      # Extract X-Auth-Token from response headers
      @x_auth_token = response.headers['X-Auth-Token']
      
      # Extract session location from response headers
      @session_location = response.headers['Location']
      
      puts "Redfish session created successfully"
      @sessions_maxed = false
      return true
    end
  rescue => e
    puts "First session creation attempt failed: #{e.message}"
  end
  
  # If that fails, try with Basic Auth
  begin
    # Use Basic Auth for the session creation
    basic_auth_headers = {
      'Authorization' => "Basic #{Base64.strict_encode64("#{username}:#{password}")}",
      'Content-Type' => 'application/json'
    }
    
    response = connection.post(url) do |req|
      req.headers.merge!(basic_auth_headers)
      req.body = payload.to_json
    end
    
    if response.status == 201 || response.status == 200
      # Extract X-Auth-Token from response headers
      @x_auth_token = response.headers['X-Auth-Token']
      
      # Extract session location from response headers
      @session_location = response.headers['Location']
      
      puts "Redfish session created successfully with Basic Auth"
      @sessions_maxed = false
      return true
    elsif response.status == 400 && response.body.include?("maximum number of user sessions")
      puts "Maximum sessions reached during Redfish session creation"
      @sessions_maxed = true
      
      # Try to clear sessions if auto_delete_sessions is enabled
      if @auto_delete_sessions
        puts "Auto-delete sessions is enabled, attempting to clear sessions"
        if force_clear_sessions
          puts "Successfully cleared sessions, trying to create a new session"
          
          # Try one more time after clearing
          response = connection.post(url) do |req|
            req.headers.merge!(basic_auth_headers)
            req.body = payload.to_json
          end
          
          if response.status == 201 || response.status == 200
            @x_auth_token = response.headers['X-Auth-Token']
            @session_location = response.headers['Location']
            puts "Redfish session created successfully after clearing sessions"
            @sessions_maxed = false
            return true
          else
            puts "Failed to create Redfish session after clearing: #{response.status} - #{response.body}"
            # If we still can't create a session, switch to direct mode
            @direct_mode = true
            return false
          end
        else
          puts "Failed to clear sessions, switching to direct mode"
          @direct_mode = true
          return false
        end
      else
        puts "Auto-delete sessions is disabled, switching to direct mode"
        @direct_mode = true
        return false
      end
    else
      puts "Failed to create Redfish session: #{response.status} - #{response.body}"
      
      # If we get a 415 error, try with form-urlencoded
      if response.status == 415
        puts "Trying with form-urlencoded content type"
        response = connection.post(url) do |req|
          req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
          req.headers['Authorization'] = "Basic #{Base64.strict_encode64("#{username}:#{password}")}"
          req.body = "UserName=#{URI.encode_www_form_component(username)}&Password=#{URI.encode_www_form_component(password)}"
        end
        
        if response.status == 201 || response.status == 200
          @x_auth_token = response.headers['X-Auth-Token']
          @session_location = response.headers['Location']
          puts "Redfish session created successfully with form-urlencoded"
          @sessions_maxed = false
          return true
        else
          puts "Failed with form-urlencoded too: #{response.status} - #{response.body}"
          @direct_mode = true
          return false
        end
      else
        @direct_mode = true
        return false
      end
    end
  rescue => e
    puts "Error during Redfish session creation: #{e.message}"
    @direct_mode = true
    return false
  end
end