class DocumentFolder < Base::DocumentFolder
  belongs_to :school
  belongs_to :classroom

  has_many :documents
  has_many :secondary_folders, foreign_key: :ParentID, class_name: 'DocumentFolder'

  scope :exclude_private, ->(flag) { where(private: false) if flag }
  scope :by_school_level, -> { where(class_id: 0) }

  def self.document_tree(folders, top_level_documents, exclude_internal)
    return if folders.blank? && top_level_documents.blank?

    @folders = folders
    parent_folders = folders.present? ? folders[0] : []
    @exclude_internal = exclude_internal

    # Iterate through all parent folders
    children = parent_folders.map { |f| child_folders(f) }

    child_documents(top_level_documents) + children
  end

  def self.child_folders(folder)
    if @folders[folder.id].nil?
      return {
        id: "folder_#{folder.id}",
        name: folder.name,
        children: child_documents(folder.documents)
      }
    end

    children = @folders[folder.id].map do |child|
      child_folders(child)
    end

    {
      id: "folder_#{folder.id}",
      name: folder.name,
      children: child_documents(folder.documents) + children
    }
  end

  def self.child_documents(documents)
    documents.map do |document|
      next if @exclude_internal && document.internal?

      {
        id: document.id,
        name: document.name,
        file: document.extension,
        google_link: document.google_edit_url
      }
    end.compact
  end
end
