# frozen_string_literal: true

require 'date'

logfile = File.open("teambuilder.pt.log")
data = logfile.read
lines = data.split("\n")

# Gets the IP address from the string
# Note: sometimes the function can fetch the UA version as an IP address
def get_line_ip(line)
  pattern = /\b(?:\d{1,3}\.){3}\d{1,3}\b/
  line.match(pattern)[0] if line.match(pattern)
end

# Returns the date in the current line
def get_line_date(line)
  pattern = /\[(.*?)\]/
  match = line.match(pattern)[0] if line.match(pattern)

  Date.parse(match.gsub("[", "").gsub("]", ""))
end

# Gets the HTTP status code of the given log line
def get_line_code(line)
  pattern = /\s(\d{3})\s/
  line.match(pattern)[1] if line.match(pattern)
end

# Gets the user agent of the given log line
def get_line_ua(line)
  pattern = /"([^"]*)"$/
  user_agent = line.match(pattern)[0] if line.match(pattern)

  user_agent.gsub('"', '')
end

# Gets the number of times an IP contacted the site
def times_appeared_single(ips, ip_to_check)
  counter = 0
  ips.each do |ip|
    if ip == ip_to_check
      counter += 1
    end
  end
  counter
end

# Returns all unique IPs in a given list of IP addresses with duplicates
def sort_unique_ip(ips)

  seen_ips = {}
  unique_ips = []

  ips.each do |ip|
    unless seen_ips[ip]
      unique_ips << ip
      seen_ips[ip] = true
    end
  end
  unique_ips
end

visit_counter = {}
client_errors = {}
all_ips = []

lines.each do | line |
  all_ips << get_line_ip(line)
end

unique_ips = sort_unique_ip(all_ips)

puts("Houve um total de #{unique_ips.length} visitas registas ao nosso site.")

unique_ips.each do |ip|
  visit_counter[ip] = times_appeared_single(all_ips, ip)
  puts("O IP #{ip} contactou o nosso site #{times_appeared_single(all_ips, ip)} vezes.")
end

lines.each do |line|
  cur_ip = get_line_ip(line)

  client_errors[cur_ip]
end
