class UsersController < ApplicationController
  before_action :find_and_authorize_user!, only: [:edit, :update]
  before_action :support_staff_only, only: [:edit]

  def index # search, really
    name = params[:name]
    @user = User.find_by_name(name)
    if @user
      redirect_to user_closet_hangers_path(@user)
    else
      flash[:alert] = t('users.index.not_found', :name => name)
      redirect_to root_path
    end
  end

  def top_contributors
    @users = User.top_contributors.paginate :page => params[:page], :per_page => 20
  end

  def edit
  end

  def update
    @user.attributes = user_params
    success = @user.save
    respond_to do |format|
      format.html {
        if success
          flash[:notice] = t('users.update.success')
          redirect_back! user_closet_hangers_path(@user)
        else
          flash[:alert] = t('users.update.invalid',
                            :errors => @user.errors.full_messages.to_sentence)
        end
      }

      format.json {
        if success
          render :json => true
        else
          render :json => {:errors => @user.errors.full_messages}, :status => :unprocessable_entity
        end
      }
    end
  end

  protected

  ALLOWED_ATTRS = [
    :owned_closet_hangers_visibility,
    :wanted_closet_hangers_visibility,
    :contact_neopets_connection_id,
  ]
  def user_params
    if support_staff?
      params.require(:user).permit(
        *ALLOWED_ATTRS, :name, :shadowbanned, :support_staff
      )
    else
      params.require(:user).permit(*ALLOWED_ATTRS)
    end
  end

  def find_and_authorize_user!
    @user = User.find(params[:id])
    raise AccessDenied unless current_user == @user || support_staff?
  end
end