# frozen_string_literal: true

# API Controller for resources of type iCalendar
class API::ICalendarController < API::ApiController
  before_action :authenticate_user!, except: %i[index events]
  before_action :set_i_cal, only: [:destroy]
  respond_to :json

  def index
    @i_cals = ICalendar.all
  end

  def create
    authorize ICalendar
    @i_cal = ICalendar.new(i_calendar_params)
    if @i_cal.save
      render :show, status: :created, location: @i_cal
    else
      render json: @i_cal.errors, status: :unprocessable_entity
    end
  end

  def destroy
    authorize ICalendar
    @i_cal.destroy
    head :no_content
  end

  def events
    start_date = ActiveSupport::TimeZone[params[:timezone]]&.parse(params[:start])
    end_date = ActiveSupport::TimeZone[params[:timezone]]&.parse(params[:end])&.end_of_day

    @events = ICalendarEvent.where(i_calendar_id: params[:id])
                            .where('dtstart >= ? AND dtend <= ?', start_date, end_date)
                            .joins(:i_calendar)
  end

  def sync
    ICalendarImportWorker.perform_async([params[:id]])
    render json: { processing: [params[:id]] }, status: :created
  end

  private

  def set_i_cal
    @i_cal = ICalendar.find(params[:id])
  end

  def i_calendar_params
    params.require(:i_calendar).permit(:name, :url, :color, :text_color, :text_hidden)
  end
end