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

    objects = students
      .current_status(current_school, params[:status]&.to_sym)
      .by_family_ids(params[:family_ids])
      .by_id(params[:student_ids])
      .search(params[:term])
      .ordered

    render_success :ok, json: objects.map { |s| student_props(s) }
  end

  def show
    return render_error :forbidden unless permission?

    render_success :ok, json: student_props(student).merge(
      date_of_birth: student.date_of_birth,
      code: student.code,
      email: student.email,
      cell_phone: student.cell_phone,
      families: student.families.map { |f| family_props(f) }
    )
  end

  private
    def student_props(student)
      {}.tap do |props|
        props[:id] = student.id
        props[:family_id] = student.family_id
        props[:first_name] = student.first_name
        props[:last_name] = student.last_name
        props[:middle_name] = student.middle_name
        props[:nickname] = student.nick_name
        props[:suffix] = student.suffix
        props[:code] = student.code
        props[:date_of_birth] = student.date_of_birth
        props[:age] = student.decorate.age
        props[:gender] = student.decorate.gender_label
        props[:grade] = student.grade
        props[:grade_label] = grade_label(student)
        props[:current] = current_student_ids.include?(student.id)
        props[:diploma] = student.requirement_label&.name
        props[:graduated] = student.graduated?
        props[:graduation_date] = student.decorate.graduation_date
        props[:avatar] = student.path_to_photo
        # remove this, in place of first_name & last_name
        props[:full_name] = student.full_name(:reverse)
      end
    end

    def family_props(family)
      { id: family.id, name: family.name }
    end

    def grade_label(student)
      grade_levels[student.grade]
    end

    def students
      base = params[:classroom_id] ? classroom : current_school
      base.students.includes(:requirement_label)
    end

    def student
      @student ||= students.find_by(id: params[:id])
    end

    def current_student_ids
      @current_student_ids ||= current_school_year.school_year_students
        .where(current: 1)
        .pluck(:student_id)
    end

    def classroom
      @classroom ||= scoped_role.classrooms.find_by(id: params[:classroom_id])
    end

    def permission?
      if action_name.to_sym == :index
        params[:classroom_id] || role == :employee
      else
        (role == :employee && params[:classroom_id]) || current_user.superuser? ||
          current_user.has_permission?('students', ['read', 'write', 'manage'])
      end
    end
end
