# frozen_string_literal: true

class EditDirectoryColumnsController < ApplicationController
  requires_login
  before_action :ensure_staff

  def index
    ensure_user_fields_have_columns

    columns = DirectoryColumn.includes(:user_field).all
    render_json_dump(directory_columns: serialize_data(columns, EditDirectoryColumnSerializer))
  end

  def update
    params.require(:directory_columns)
    directory_column_params = params.permit(directory_columns: {})
    directory_columns = DirectoryColumn.all

    has_enabled_column =
      directory_column_params[:directory_columns].values.any? do |column_data|
        column_data[:enabled].to_s == "true"
      end
    unless has_enabled_column
      raise Discourse::InvalidParameters, "Must have at least one column enabled"
    end

    new_values = ""
    previous_values = ""
    staff_action_logger = StaffActionLogger.new(current_user)

    directory_column_params[:directory_columns].values.each do |column_data|
      existing_column = directory_columns.detect { |c| c.id == column_data[:id].to_i }
      if (
           existing_column.enabled != ActiveModel::Type::Boolean.new.cast(column_data[:enabled]) ||
             existing_column.position != column_data[:position].to_i
         )
        new_value, previous_value =
          staff_action_logger.edit_directory_columns_details(column_data, existing_column)

        new_values += new_value
        previous_values += previous_value

        existing_column.update(
          enabled: column_data[:enabled],
          position: column_data[:position].to_i,
        )
      end
    end

    details = {}

    staff_action_logger.log_custom(
      "update_directory_columns",
      { previous_value: previous_values, new_value: new_values },
    )
    render json: success_json
  end

  private

  def ensure_user_fields_have_columns
    user_fields_without_column =
      UserField
        .left_outer_joins(:directory_column)
        .where(directory_column: { user_field_id: nil })
        .where("show_on_profile=? OR show_on_user_card=?", true, true)

    return if user_fields_without_column.count <= 0

    next_position = DirectoryColumn.maximum("position") + 1

    new_directory_column_attrs = []
    user_fields_without_column.each do |user_field|
      new_directory_column_attrs.push(
        {
          user_field_id: user_field.id,
          enabled: false,
          type: DirectoryColumn.types[:user_field],
          position: next_position,
        },
      )

      next_position += 1
    end

    DirectoryColumn.insert_all(new_directory_column_attrs)
  end
end