# frozen_string_literal: true

# API Controller for resources of type ReservationContext
class API::ReservationContextsController < API::APIController
  before_action :authenticate_user!, except: [:index]
  before_action :set_reservation_context, only: %i[show update destroy]

  def index
    @reservation_contexts = ReservationContext.all
    @reservation_contexts = @reservation_contexts.applicable_on(params[:applicable_on]) if params[:applicable_on].present?
    @reservation_contexts = @reservation_contexts.order(:created_at)
  end

  def show; end

  def create
    authorize ReservationContext
    @reservation_context = ReservationContext.new(reservation_context_params)
    if @reservation_context.save
      render :show, status: :created, location: @reservation_context
    else
      render json: @reservation_context.errors, status: :unprocessable_entity
    end
  end

  def update
    authorize ReservationContext
    if @reservation_context.update(reservation_context_params)
      render :show, status: :ok, location: @reservation_context
    else
      render json: @reservation_context.errors, status: :unprocessable_entity
    end
  end

  def destroy
    authorize ReservationContext
    if @reservation_context.safe_destroy
      head :no_content
    else
      render json: @reservation_context.errors, status: :unprocessable_entity
    end
  end

  def applicable_on_values
    authorize ReservationContext
    render json: ReservationContext::APPLICABLE_ON, status: :ok
  end

  private

  def set_reservation_context
    @reservation_context = ReservationContext.find(params[:id])
  end

  def reservation_context_params
    params.require(:reservation_context).permit(:name, applicable_on: [])
  end
end