# frozen_string_literal: true

module ApplicationHelper
  # Returns a string build from the start and end date of the given conference.
  #
  # If the conference is only one day long
  # * %B %d %Y (January 17 2014)
  # If the conference starts and ends in the same month and year
  # * %B %d - %d, %Y (January 17 - 21 2014)
  # If the conference ends in another month but in the same year
  # * %B %d - %B %d, %Y (January 31 - February 02 2014)
  # All other cases
  # * %B %d, %Y - %B %d, %Y (December 30, 2013 - January 02, 2014)
  def date_string(start_date, end_date)
    startstr = 'Unknown - '
    endstr = 'Unknown'
    # When the conference is in the same month
    if start_date.month == end_date.month && start_date.year == end_date.year
      if start_date.day == end_date.day
        startstr = start_date.strftime('%B %d')
        endstr = end_date.strftime(' %Y')
      else
        startstr = start_date.strftime('%B %d - ')
        endstr = end_date.strftime('%d, %Y')
      end
    elsif start_date.month != end_date.month && start_date.year == end_date.year
      startstr = start_date.strftime('%B %d - ')
      endstr = end_date.strftime('%B %d, %Y')
    else
      startstr = start_date.strftime('%B %d, %Y - ')
      endstr = end_date.strftime('%B %d, %Y')
    end

    result = startstr + endstr
    result
  end

  # Returns time with conference timezone
  def time_with_timezone(time)
    time.strftime('%F %R') + ' ' + @conference.timezone.to_s
  end

  # Set resource_name for devise so that we can call the devise help links (views/devise/shared/_links) from anywhere (eg sign_up form in proposals#new)
  def resource_name
    :user
  end

  def add_association_link(association_name, form_builder, div_class, html_options = {})
    link_to_add_association 'Add ' + association_name.to_s.singularize, form_builder, div_class, html_options.merge(class: 'assoc btn btn-success')
  end

  def remove_association_link(association_name, form_builder)
    link_to_remove_association('Remove ' + association_name.to_s.singularize, form_builder, class: 'assoc btn btn-danger') + tag(:hr)
  end

  def dynamic_association(association_name, title, form_builder, options = {})
    render 'shared/dynamic_association', association_name: association_name, title: title, f: form_builder, hint: options[:hint]
  end

  def tracks(conference)
    conference.confirmed_tracks.collect(&:name).to_sentence
  end

  def difficulty_levels(conference)
    conference.program.difficulty_levels.map(&:title).to_sentence
  end

  def unread_notifications(user)
    Comment.accessible_by(current_ability).find_since_last_login(user)
  end

  # Receives a PaperTrail::Version object
  # Outputs the list of attributes that were changed in the version (ignoring changes from one blank value to another)
  # Eg: If version.changeset = '{"title"=>[nil, "Premium"], "description"=>[nil, "Premium = Super cool"], "conference_id"=>[nil, 3]}'
  # Output will be 'title, description and conference'
  def updated_attributes(version)
    version.changeset
      .reject{ |_, values| values[0].blank? && values[1].blank? }
      .keys.map{ |key| key.gsub('_id', '').tr('_', ' ')}.join(', ')
      .reverse.sub(',', ' dna ').reverse
  end

  def normalize_array_length(hashmap, length)
    hashmap.each_value do |value|
      if value.length < length
        value.fill(value[-1], value.length...length)
      end
    end
  end

  def concurrent_events(event)
    return nil unless event.scheduled? && event.program.selected_event_schedules

    event_schedule = event.program.selected_event_schedules.find { |es| es.event == event }
    other_event_schedules = event.program.selected_event_schedules.reject { |other_event_schedule| other_event_schedule == event_schedule }
    concurrent_events = []

    event_time_range = (event_schedule.start_time.strftime '%Y-%m-%d %H:%M')...(event_schedule.end_time.strftime '%Y-%m-%d %H:%M')
    other_event_schedules.each do |other_event_schedule|
      next unless other_event_schedule.event.confirmed?

      other_event_time_range = (other_event_schedule.start_time.strftime '%Y-%m-%d %H:%M')...(other_event_schedule.end_time.strftime '%Y-%m-%d %H:%M')
      if (event_time_range.to_a & other_event_time_range.to_a).present?
        concurrent_events << other_event_schedule.event
      end
    end
    concurrent_events
  end

  def speaker_links(event)
    safe_join(event.speakers.map{ |speaker| link_to speaker.name, admin_user_path(speaker) }, ',')
  end

  def event_types_sentence(conference)
    conference.event_types.map { |et| et.title.pluralize }.to_sentence
  end

  def sign_in_path
    if ENV.fetch('OSEM_ICHAIN_ENABLED', nil) == 'true'
      new_user_ichain_session_path
    else
      new_user_session_path
    end
  end

  def rescheduling_hint(affected_event_count)
    if affected_event_count > 0
      "You have #{affected_event_count} scheduled #{'event'.pluralize(affected_event_count)}. Changing the conference hours will unschedule those scheduled outside the conference hours."
    end
  end

  ##
  # ====Gets
  # a conference object
  # ==== Returns
  # class hidden if conference is over
  def hidden_if_conference_over(conference)
    'hidden' if Date.today > conference.end_date
  end

  def nav_root_link_for(conference)
    link_text = (
      conference.try(:organization).try(:name) || ENV.fetch('OSEM_NAME', 'OSEM')
    )
    link_to(
      link_text,
      root_path,
      class: 'navbar-brand',
      title: 'Open Source Event Manager'
    )
  end

  # returns the url to be used for logo on basis of sponsorship level position
  def get_logo(object)
    if object.try(:sponsorship_level)
      if object.sponsorship_level.position == 1
        object.picture.first.url
      elsif object.sponsorship_level.position == 2
        object.picture.second.url
      else
        object.picture.others.url
      end
    else
      object.picture.large.url
    end
  end
end
