# frozen_string_literal: true

module TeamBySubjectModel
  extend ActiveSupport::Concern

  class_methods do
    def team_by_subject(subjects)
      teams = []
      valid_subjects = Extends::ACTIVITY_SUBJECT_CHILDREN
      # Check all activity subject
      valid_subjects.each do |subject, _children|
        subject = subject.to_s.camelize.to_sym
        next unless subjects[subject]

        parent_array = [subject.to_s.underscore]
        find_parent = true
        # Trying to build parent array
        while find_parent
          possible_parent = valid_subjects.find { |_sub, ch| ((ch || []).include? parent_array[-1].pluralize.to_sym) }
          possible_parent = { Project: nil } if parent_array[-1] == 'experiment'
          if possible_parent
            parent_array.push(possible_parent.flatten[0].to_s.underscore)
          else
            find_parent = false
          end
        end
        # Remove initial object from parent array
        parent_array.shift
        subjects[subject].each do |child|
          child_subject = subject.to_s.constantize.find_by_id(child)
          next unless child_subject

          # Call all parent subjects
          parent_array.each do |parent|
            temp_child_subject = child_subject.public_send(parent)
            # Some fix for protocols in repository
            break unless temp_child_subject

            child_subject = temp_child_subject
          end
          teams.push(child_subject.team_id)
        end
      end
      teams.uniq
    end
  end
end
