class Users::BaseController < ApplicationController

  before_action :check_observed_user_exists!

  helper_method :observed_logged_user?, :observed_user

  def observed_user
    @_observed_user ||= (User.find_by_id(params[:user_id]) || User.find_by_login(params[:user_id]))
  end

  def observed_logged_user?
    observed_user.id == User.current&.id
  end

  private

  def check_observed_user_exists!
    return if observed_user.present?
    render_not_found
  end

  def private_user_resources!
    require_login
    return if current_user.admin_or_business? || observed_logged_user?

    render_forbidden
  end

  def require_teacher!
    return if current_user.admin_or_business? || observed_user.is_teacher?

    render_forbidden
  end

  def require_auth_teacher!
    return if current_user.admin_or_business? || observed_user.certification_teacher?

    render_forbidden
  end

  def page_value
    params[:page].to_i <= 0 ? 1 : params[:page].to_i
  end

  def per_page_value
    params[:per_page].to_i > 0 && params[:per_page].to_i <= 100 ? params[:per_page].to_i : 20
  end
  alias_method :limit_value, :per_page_value

  def offset_value
    (page_value - 1) * limit_value
  end

  def paginate(objs, **opts)
    page     = page_value
    per_page = per_page_value

    unless opts[:special] && observed_logged_user?
      if objs.is_a?(Array)
        return Kaminari.paginate_array(objs).page(page).per(per_page)
      else
        return objs.page(page).per(per_page)
      end
    end

    # note: 为实现第一页少一条记录，让前端放置新建入口
    if page == 1
      objs.limit(per_page - 1)
    else
      objs.limit(per_page).offset((page - 2) * per_page + per_page - 1)
    end
  end
end