module Admin
  class OrganizationsController < Admin::ApplicationController
    layout "admin"
    PER_PAGE_MAX = 50

    CREDIT_ACTIONS = {
      add: :add_to,
      remove: :remove_from
    }.with_indifferent_access.freeze

    def index
      @organizations = Organization.page(params[:page]).per(PER_PAGE_MAX)
      @organizations = if params[:search].present?
                         @organizations.simple_name_match(params[:search].presence)
                       else
                         @organizations.order("created_at DESC")
                       end
    end

    def show
      @organization = Organization.find(params[:id])
    end

    def update_org_credits
      org = Organization.find(params[:id])
      amount = params[:credits].to_i
      update_action = CREDIT_ACTIONS.fetch(params[:credit_action])

      Credit.public_send(update_action, org, amount)
      add_note(org)

      flash[:notice] = I18n.t("admin.organizations_controller.credit_updated")
      redirect_to admin_organization_path(org)
    end

    def destroy
      organization = Organization.find_by(id: params[:id])
      Organizations::DeleteWorker.perform_async(organization.id, current_user.id, false)

      flash[:settings_notice] =
        I18n.t("admin.organizations_controller.deletion_scheduled", organization_name: organization.name)
      redirect_to admin_organization_url(params[:id])
    rescue StandardError => e
      flash[:error] = I18n.t("admin.organizations_controller.error", organization_name: organization.name, error: e)
      redirect_to user_settings_path(:organization, id: organization.id)
    end

    private

    def add_note(org)
      Note.create(
        author_id: current_user.id,
        noteable_id: org.id,
        noteable_type: "Organization",
        reason: "misc_note",
        content: params[:note],
      )
    end
  end
end
