class TitleProviderGroupNameProcessor < BaseProcessor
  def run(params)
    @authorization = JSON.parse(params[:authorization]) rescue OpenStruct.new
    assign_attributes(name: params[:name], title_provider_groups_attributes: title_provider_groups_attributes)
    save
  end

  def title_provider_groups_attributes
    provider_id = @authorization.keys.map(&:to_i)
    persisted_provider_id = title_provider_groups.map(&:provider_id)

    delete_attr = title_provider_groups.select { |a| a.provider_id.in?(persisted_provider_id - provider_id) }.map do |title_provider_group|
      attr = {}
      attr['id'] = title_provider_group.id
      attr['_destroy'] = true
      attr
    end
    update_attr = title_provider_groups.select { |a| a.provider_id.in?(provider_id & persisted_provider_id) }.map do |title_provider_group|
      attr = {}
      attr['id'] = title_provider_group.id
      attr['authorizations_attributes'] = authorizations_attributes_for(title_provider_group)
      attr.reject { |_, v| v.blank? }
    end.reject { |a| a['authorizations_attributes'].nil? }
    create_attr = (provider_id - persisted_provider_id).map do |created_provider_id|
      attr = {}
      attr['provider_id'] = created_provider_id
      attr['authorizations_attributes'] = authorizations_attributes_for(OpenStruct.new(provider_id: created_provider_id, authorizations: []))
      attr.reject { |_, v| v.blank? }
    end
    delete_attr + update_attr + create_attr
  end

  def authorizations_attributes_for(title_provider_group)
    permission_label_id = @authorization[title_provider_group.provider_id.to_s]
    persisted_permission_label_id = title_provider_group.authorizations.map(&:permission_label_id)
    delete_attr = title_provider_group.authorizations.select { |a| a.permission_label_id.in?(persisted_permission_label_id - permission_label_id) }.map do |authorizations|
      attr = {}
      attr['id'] = authorizations.id
      attr['_destroy'] = true
      attr
    end
    create_attr = (permission_label_id - persisted_permission_label_id).map do |created_permission_label_id|
      attr = {}
      attr['permission_label_id'] = created_permission_label_id
      attr
    end
    delete_attr + create_attr
  end

  def authorization_columns
    Authorization.column_names - %w[id title_provider_group_id]
  end
end
