class GroupsController < ApplicationController
  before_action :set_group, only: [:show, :edit, :update, :destroy,
                                   :add_user, :remove_user,:remove_all_user,
                                   :add_problem, :remove_problem,:remove_all_problem,
                                   :toggle,
                                  ]
  before_action :admin_authorization

  # GET /groups
  def index
    @groups = Group.all
  end

  # GET /groups/1
  def show
  end

  # GET /groups/new
  def new
    @group = Group.new
  end

  # GET /groups/1/edit
  def edit
  end

  # POST /groups
  def create
    @group = Group.new(group_params)

    if @group.save
      redirect_to @group, notice: 'Group was successfully created.'
    else
      render :new
    end
  end

  # PATCH/PUT /groups/1
  def update
    if @group.update(group_params)
      redirect_to @group, notice: 'Group was successfully updated.'
    else
      render :edit
    end
  end

  # DELETE /groups/1
  def destroy
    @group.destroy
    redirect_to groups_url, notice: 'Group was successfully destroyed.'
  end

  def toggle
    @group.enabled = @group.enabled? ? false : true
    @group.save
  end

  def remove_user
    user = User.find(params[:user_id])
    @group.users.delete(user)
    redirect_to group_path(@group), flash: {success: "User #{user.login} was removed from the group #{@group.name}"}
  end

  def remove_all_user
    @group.users.clear
    redirect_to group_path(@group), alert: 'All users removed'
  end

  def remove_all_problem
    @group.problems.clear
    redirect_to group_path(@group), alert: 'All problems removed'
  end

  def add_user
    user = User.find(params[:user_id])
    begin
      @group.users << user
      redirect_to group_path(@group), flash: { success: "User #{user.login} was add to the group #{@group.name}"}
    rescue => e
      redirect_to group_path(@group), alert: e.message
    end
  end

  def remove_problem
    problem = Problem.find(params[:problem_id])
    @group.problems.delete(problem)
    redirect_to group_path(@group), flash: {success: "Problem #{problem.name} was removed from the group #{@group.name}" }
  end

  def add_problem
    problem = Problem.find(params[:problem_id])
    begin
      @group.problems << problem
      redirect_to group_path(@group), flash: {success: "Problem #{problem.name} was add to the group #{@group.name}" }
    rescue => e
      redirect_to group_path(@group), alert: e.message
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_group
      @group = Group.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def group_params
      params.require(:group).permit(:name, :description, :enabled)
    end
end
