# frozen_string_literal: true

# Import all events from a given remote RFC 5545 iCalendar
class ICalendarImportService
  def import(i_calendar_id)
    require 'net/http'
    require 'uri'
    require 'icalendar'

    uids = []

    i_cal = ICalendar.find(i_calendar_id)
    ics = Net::HTTP.get(URI.parse(i_cal.url))
    cals = Icalendar::Calendar.parse(ics)

    # create new events and update existings
    cals.each do |cal|
      cal.events.each do |evt|
        uids.push(evt.uid.to_s)
        ICalendarEvent.update_or_create_by(
          { uid: evt.uid.to_s },
          {
            dtstart: evt.dtstart,
            dtend: evt.dtend,
            summary: evt.summary,
            description: evt.description,
            i_calendar_id: i_calendar_id
          }
        )
      end
    end
    # remove deleted events
    ICalendarEvent.where(i_calendar_id: i_calendar_id).where.not(uid: uids).destroy_all
  end
end