# frozen_string_literal: true

require 'uri'

module EventsHelper
  def all_events(year = nil, soon = nil)
    items_ = if year
               @items.find_all("/events/#{year}/*.md")
             else
               @items.find_all('/events/*/*.md')
             end

    items_.select { |x| x[:soon] == soon }.sort_by { |x| x[:time] }
  end

  def tag_event_items
    Set.new(items
      .find_all('/events/*/*')
      .flat_map { |i| i[:tags] || [] })
    .to_a
    .sort
    .uniq.map { |y| [y, items["/events/#{y.gsub(' ', '_')}.html"]]}
  end

  def all_events_by_tag(tag = nil, soon = nil)
    @items.find_all('/events/*/*.md')
      .filter{|i| (i[:tags] || []).include? tag }
      .select { |x| x[:soon] == soon }
      .sort_by { |x| x[:time] }
  end

  def soon_events
    all_events(nil, true)
  end

  def upcoming_events(year = nil)
    all_events(year).reject { |x| x[:time] <= Date.today }
  end

  def upcoming_events_in_year_or_tag(item)
    if item[:is_yearly]
      upcoming_events(item[:academic_year])
    else
      all_events_by_tag(item[:tag]).reject { |x| x[:time] <= Date.today }
    end
  end

  def past_events(year = nil)
    all_events(year).reject { |x| x[:time] > Date.today }.reverse
  end

  def past_events_in_year_or_tag(item)
    if item[:is_yearly]
      past_events(item[:academic_year])
    else
      all_events_by_tag(item[:tag]).reject { |x| x[:time] > Date.today }.reverse
    end
  end

  def academic_years_event_items
    items.find_all('/events/*').reject { |e| e[:academic_year].nil? }.map { |e| [e[:academic_year], e] }.sort_by(&:first).reverse
  end

  def grouped_events
    @items.find_all('/events/*/*/main.md')
  end

  def front_page_events
    upcoming_events + all_events.reverse[(upcoming_events.length)..]
  end

  def sub_events(grouped_event)
    if grouped_event.identifier =~ /main.md/
      query = grouped_event.identifier.to_s.split('/')[0..-2].join('/') + '/*'
      @items.find_all(query).reject do |i|
        i.identifier =~ /main.md/
      end
    else
      []
    end
  end
end
