class SampleGroupsController < ApplicationController
  before_action :load_vars_nested
  before_action :check_view_permissions, only: %i(index sample_group_element)
  before_action :check_manage_permissions, only: %i(create edit update destroy
                                                    destroy_confirmation)
  before_action :set_sample_group, except: %i(create index)
  before_action :set_project_my_module, only: :index
  layout 'fluid'

  def create
    @sample_group = SampleGroup.new(sample_group_params)
    @sample_group.team = @team
    @sample_group.created_by = current_user
    @sample_group.last_modified_by = current_user

    respond_to do |format|
      if @sample_group.save
        format.json do
          render json: {
            html: render_to_string(
              partial: 'sample_group.html.erb',
                       locals: { sample_group: @sample_group,
                                 team: @team }
            )
          },
          status: :ok
        end
      else
        format.json do
          render json: @sample_group.errors,
            status: :unprocessable_entity
        end
      end
    end
  end

  def index
    render_404 unless current_team
    @sample_groups = current_team.sample_groups
  end

  def update
    @sample_group.update_attributes(sample_group_params)

    respond_to do |format|
      format.json do
        if @sample_group.save
          render json: {
            html: render_to_string(
              partial: 'sample_group.html.erb',
                       locals: { sample_group: @sample_group,
                                 team: @team }
            )
          }
        else
          render json: @sample_group.errors,
                 status: :unprocessable_entity
        end
      end
    end
  end

  def edit
    respond_to do |format|
      format.json do
        render json: {
          html:
            render_to_string(
              partial: 'edit.html.erb',
                       locals: { sample_group: @sample_group,
                                 team: @team }
            ),
          id: @sample_group.id
        }
      end
    end
  end

  def sample_group_element
    respond_to do |format|
      format.json do
        render json: {
          html: render_to_string(
            partial: 'sample_group.html.erb',
                     locals: { sample_group: @sample_group,
                               team: @team }
          )
        }
      end
    end
  end

  def destroy_confirmation
    respond_to do |format|
      format.json do
        render json: {
          html: render_to_string(
            partial: 'delete_sample_group_modal.html.erb',
                     locals: { sample_group: @sample_group,
                               team: @team }
          )
        }
      end
    end
  end

  def destroy
    flash[:success] = t 'sample_groups.index.destroy_flash',
                        name: @sample_group.name
    Sample.where(sample_group: @sample_group).find_each do |sample|
      sample.update(sample_group_id: nil)
    end
    @sample_group.destroy
    redirect_back(fallback_location: root_path)
  end

  private

  def set_project_my_module
    @project = Project.find_by_id(params[:project_id]) if params[:project_id]
    @experiment = Experiment
                  .find_by_id(params[:experiment_id]) if params[:experiment_id]
    @my_module = MyModule
                 .find_by_id(params[:my_module_id]) if params[:my_module_id]
    render_403 unless @project || @my_module
  end

  def set_sample_group
    @sample_group = SampleGroup.find_by_id(params[:id])
  end

  def load_vars_nested
    @team = Team.find_by_id(params[:team_id])

    render_404 unless @team
  end

  def check_view_permissions
    render_403 unless can_read_team?(@team)
  end

  def check_manage_permissions
    render_403 unless can_manage_sample_types_and_groups?(@team)
  end

  def sample_group_params
    params.require(:sample_group).permit(:name, :color)
  end
end