require 'net/http'
require 'net/http/post/multipart'
require 'uri'
require 'json'

# The URL you want to send the POST request to
url = URI.parse('http://localhost:4567/auth/login')

# Create a new Net::HTTP object with the target server
http = Net::HTTP.new(url.host, url.port)

# If your server uses HTTPS, you might need to enable SSL
# http.use_ssl = true

# Create a new Net::HTTP::Post request with the desired path
request = Net::HTTP::Post.new(url.path)

puts 'Enter username:'
username = gets.strip!
puts 'Enter password'
password = gets.strip!

# Set the request body with the data you want to send
request.body = "username=#{username}&password=#{password}"
#request.body = "username=admin&password=pass123"

# Set the 'Content-Type' header if needed
request['Content-Type'] = 'application/x-www-form-urlencoded'

# Send the request and get the response
response = http.request(request)

unless response.code == '200'
    puts "Response Code: #{response.code}. Aborting."
    puts "Response Body: #{response.body}"
    puts "Aborting."
    exit
end

puts 'Reauthentication token stored.'

response_data = JSON.parse(response.body)
reauthentication_token = response_data['token']

#while true
    url = URI.parse('http://localhost:4567/auth/reauthenticate')
    request = Net::HTTP::Post.new(url.path)

    request['Authorization'] = "Bearer #{reauthentication_token}"

    response = http.request(request)    

    unless response.code == '200'
        puts "Response Code: #{response.code}. Aborting."
        puts "Response Body: #{response.body}"
        puts "Aborting."
        exit
    end

    #puts response.body

    response_data = JSON.parse(response.body)
    authentication_token = response_data['jwt']

    #end
    
    ############# Do Files Test
    #sleep(2)

# Read the file contents
file_content = File.read('./example.txt')

# Create a URI object for the API endpoint
uri = URI.parse('http://localhost:4567/upload')

# Create a Net::HTTP object
http = Net::HTTP.new(uri.host, uri.port)

request = Net::HTTP::Post::Multipart.new(
  uri.path,
  'file' => UploadIO.new(StringIO.new(file_content), 'application/octet-stream', 'example.txt')
)

request['Authorization'] = "Bearer #{authentication_token}"

# Send the request
puts "Sending file of size #{(File.size('./example.txt') / 2**20).round(2)} MB"
response = http.request(request)

#puts response.code

unless response.code == '200'
    puts response.code
else
    puts response.body
end