class AtWhoController < ApplicationController
  before_action :load_vars
  before_action :check_users_permissions

  def users
    respond_to do |format|
      format.json do
        render json: {
          users: generate_users_data,
          status: :ok
        }
      end
    end
  end

  def menu_items
    res = SmartAnnotation.new(current_user, current_team, @query)

    respond_to do |format|
      format.json do
        render json: {
          prj: res.projects,
          exp: res.experiments,
          tsk: res.my_modules,
          sam: res.samples,
          status: :ok
        }
      end
    end
  end

  def samples
    res = SmartAnnotation.new(current_user, current_team, @query)
    respond_to do |format|
      format.json do
        render json: {
          res: res.samples,
          status: :ok
        }
      end
    end
  end

  def projects
    res = SmartAnnotation.new(current_user, current_team, @query)
    respond_to do |format|
      format.json do
        render json: {
          res: res.projects,
          status: :ok
        }
      end
    end
  end

  def experiments
    res = SmartAnnotation.new(current_user, current_team, @query)
    respond_to do |format|
      format.json do
        render json: {
          res: res.experiments,
          status: :ok
        }
      end
    end
  end

  def my_modules
    res = SmartAnnotation.new(current_user, current_team, @query)
    respond_to do |format|
      format.json do
        render json: {
          res: res.my_modules,
          status: :ok
        }
      end
    end
  end

  private

  def load_vars
    @team = Team.find_by_id(params[:id])
    @query = params[:query]
    render_404 unless @team
  end

  def check_users_permissions
    render_403 unless can_view_team_users(@team)
  end

  def generate_users_data
    # Search users
    res = @team.search_users(@query)
               .limit(Constants::ATWHO_SEARCH_LIMIT)
               .pluck(:id, :full_name, :email)

    # Add avatars, Base62, convert to JSON
    data = []
    res.each do |obj|
      tmp = {}
      tmp['id'] = obj[0].base62_encode
      tmp['full_name'] =
        obj[1].truncate(Constants::NAME_TRUNCATION_LENGTH_DROPDOWN)
      tmp['email'] = obj[2]
      tmp['img_url'] = avatar_path(obj[0], :icon_small)
      data << tmp
    end
    data
  end
end
