# frozen_string_literal: true

# Parameters for OpenAPI endpoints
class OpenAPI::V1::BaseController < ActionController::Base
  protect_from_forgery with: :null_session
  skip_before_action :verify_authenticity_token
  before_action :authenticate
  before_action :increment_calls_count

  rescue_from ActiveRecord::RecordNotFound, with: :not_found
  rescue_from OpenAPI::ParameterError, with: :bad_request
  rescue_from ActionController::ParameterMissing, with: :bad_request

  rescue_from TypeError, with: :server_error
  rescue_from NoMethodError, with: :server_error
  rescue_from ArgumentError, with: :server_error

  helper_method :current_api_client

  protected

  def not_found(exception)
    render json: { errors: ['Not found', exception] }, status: :not_found
  end

  def bad_request(exception)
    render json: { errors: ['Bad request', exception] }, status: :bad_request
  end

  def server_error(exception)
    render json: { error: ['Server error', exception] }, status: :internal_server_error
  end

  def authenticate
    authenticate_token || render_unauthorized
  end

  def authenticate_token
    authenticate_with_http_token do |token, _options|
      @open_api_client = OpenAPI::Client.find_by(token: token)
    end
  end

  def current_api_client
    @open_api_client
  end

  def render_unauthorized
    render json: { errors: ['Bad credentials'] }, status: 401
  end

  private

  def increment_calls_count
    @open_api_client.increment_calls_count
  end
end
