# frozen_string_literal: true

# Gestiona eventos compatibles con jekyll-ical
class MetadataEvent < MetadataTemplate
  # Preferimos los husos horarios en números porque los husos con
  # nombres dejan afuera territorios que comparten el mismo huso que
  # otras ciudades más hegemónicas.
  #
  # @see {https://en.wikipedia.org/wiki/List_of_UTC_time_offsets}
  TIMEZONES = %w[-12:00 -11:00 -10:00 -09:30 -09:00 -08:00 -07:00 -06:00
                 -05:00 -04:00 -03:30 -03:00 -02:00 -01:00 00:00 +01:00 +02:00 +03:00
                 +03:30 +04:00 +04:30 +05:00 +05:30 +05:45 +06:00 +06:30 +07:00 +08:00
                 +08:45 +09:00 +09:30 +10:00 +10:30 +11:00 +12:00 +12:45 +13:00
                 +14:00].freeze

  # El valor por defecto es un Hash con algunas llaves pero queremos que
  # sea opcional.
  #
  # @return [Hash]
  def default_value
    super || {}
  end

  def to_param
    { name => {} }
  end

  # Dates are required and need to be parseable
  def validate
    self.errors = []
    times = []

    %w[dtstart dtend].each do |dt|
      errors << I18n.t("metadata.#{type}.zone_missing") unless TIMEZONES.include? value.dig(dt, 'zone')
      errors << I18n.t("metadata.#{type}.date_missing") if value.dig(dt, 'date').blank?

      begin
        Date.parse value.dig(dt, 'date')
      rescue ArgumentError, TypeError
        errors << I18n.t("metadata.#{type}.date_non_parseable")
      end

      unless (time = value.dig(dt, 'time')).blank?
        errors << I18n.t("metadata.#{type}.time_non_parseable") unless /[0-5][0-9]:[0-5][0-9]/ =~ time
      end

      times << value.dig(dt, 'date') + ' ' + value.dig(dt, 'time')
    end

    begin
      dtstart, dtend = times.map { |t| Time.parse t }
      errors << I18n.t("metadata.#{type}.end_in_the_past") if dtstart > dtend
    rescue ArgumentError
      errors << I18n.t("metadata.#{type}.time_non_parseable")
    end

    errors.empty?
  end

  def sanitize(hash)
    self[:value] = %w[dtstart dtend].map do |dt|
      time = hash.dig(dt, 'time')

      [
        dt, {
          'zone' => hash.dig(dt, 'zone'),
          'date' => Date.parse(hash.dig(dt, 'date')).to_s,
          'time' => time.blank? ? '00:00' : time
        }
      ]
    end.to_h
  end
end