class School::Legacy::Directory::FamiliesController < ApplicationController
  def index
    return render_error :forbidden unless permission?

    families = current_families.search(params[:term]).ordered
    families = families.reject { |f| f.directory.zero? }
    render_success :ok, json: families.map { |f| family_props(f) }
  end

  def show
    family = current_families.find_by(id: params[:id])
    if permission?
      render_success :ok, json: family_props(family)
    else
      render_error :forbidden
    end
  end

  private
    def current_families
      current_school.families
        .includes(:primary_students, :secondary_students, :primary_contacts)
        .current_status(:current)
    end

    def family_students(family)
      family.all_students
        .join_school_year_student(current_school_year.id, :current)
        .ordered
    end

    def permissions
      @permissions ||= current_school.school_config
        .directory_permissions(current_user.role)
    end

    def permission?
      current_user.level.positive? || permissions[:family]
    end

    def contact_family(family, contact)
      family.contact_families.find_by(contact: contact)
    end

    def family_props(family)
      {}.tap do |props|
        props[:id] = family.id
        props[:name] = family.name
        props[:address] = address_props(family, family.directory_address.zero?)
        props[:phone] = family.home_phone if family.directory_phone.zero?
        props[:primary_contacts] = family.contacts.primary.map { |c| contact_props(c, family) }
        props[:students] = family_students(family).map { |s| student_props(s) }
      end
    end

    def address_props(person, include_address)
      return {} unless include_address

      {}.tap do |props|
        if action_name.to_sym == :show
          props[:line_1] = person.address
          props[:line_2] = person.address_ext
          props[:zip] = person.zip
        end
        props[:city] = person.city
        props[:state] = person.state
      end
    end

    def contact_props(contact, family)
      {}.tap do |props|
        props[:id] = contact.id
        props[:title] = contact.title&.name
        props[:first_name] = contact.first_name
        props[:last_name] = contact.last_name
        props[:address] = address_props(contact, family.directory_address.zero?)
        props[:relationship] = contact_family(family, contact).relationship.name
        props[:email] = contact.email if family.directory_email.zero?
        props[:home_phone] = contact.home_phone if family.directory_phone.zero?
        props[:cell_phone] = contact.cell_phone if family.directory_cell.zero?
      end
    end

    def student_props(student)
      {}.tap do |props|
        props[:id] = student.id
        props[:first_name] = student.first_name
        props[:last_name] = student.last_name
        props[:grade_level] = grade_levels[student.grade]
        props[:graduated] = student.graduated
        props[:current] = student.current?
      end
    end
end
