#!/usr/bin/env ruby
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file, You can
# obtain one at https://mozilla.org/MPL/2.0/. -}

# frozen_string_literal: true

require 'date'
require 'zlib'
require 'pathname'

class Visit
  attr_accessor :page, :date

  def initialize(match_data)
    @date = Date.iso8601 match_data[1]
    @page = match_data[2].strip
  end
end

def numeric_extension(filename)
  if filename.extname == '.gz'
    filename.sub_ext('').extname[1..-1].to_i
  elsif filename.extname == '.log'
    0
  else
    filename.extname[1..-1].to_i
  end
end

entries = Dir.new('log')
  .entries
  .reject { |entry| entry.start_with? '.' }
  .map { |entry| Pathname.new entry }
  .sort { |a, b| numeric_extension(b) <=> numeric_extension(a) }

def read_lines(stream)
  if ARGV.length > 0
    regex = /([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}).+#{ARGV[0]}(.+) /
  else
    regex = /([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2})(.+) /
  end

  stream
    .map { |line| line.match regex }
    .reject { |line| line.nil? }
    .map { |match_data| Visit.new match_data }
end

lines_in_all_files = entries.flat_map do |log|
  log_path = Pathname.new('log') + log

  if log_path.extname == '.gz'
    File.open log_path.to_s do |file|
      read_lines Zlib::GzipReader.new(file).readlines
    end
  else
    read_lines File.readlines(log_path.to_s)
  end
end

lines_in_all_files.each do |visit|
  puts "#{visit.date.strftime} (#{visit.page})"
end