class Student::Legacy::Classrooms::AssignmentsController < Student::Controller
  include Student::ClassroomScoped

  def index
    render_success :ok, json: assignments.map { |a| assignment_props(a) }
  end

  def show
    data = assignment_props(assignment)
    data[:documents] =  documents.map { |d| document_props(d) }
    render_success :ok, json: data
  end

  private
    def assignments
      current_student.class_assignments
        .includes(:class_subject, :class_grade_category, :classroom)
        .exclude_future
        .by_status(params[:status])
        .by_subject(params[:subject_id])
        .by_grade_status(params[:grade_status], current_student)
        .without_grade_status(params[:without_grade_status], current_student)
        .by_classroom(params[:classroom_id])
        .by_quarter(params[:quarter])
    end

    def assignment
      @assignment ||= assignments.find_by(id: params[:id])
    end

    def documents
      assignment.documents
    end

    def grade_by_assignment
      @grade_by_assignment ||= current_student.class_grades.index_by(&:class_assignment_id)
    end

    def assignment_props(assignment)
      {}.tap do |props|
        props[:id] = assignment.id
        props[:name] = assignment.name
        props[:due_date] = assignment.due_date
        props[:subject] = assignment.class_subject&.name
        props[:subject_id] = assignment.class_subject&.id
        props[:possible] = assignment.possible
        props[:category] = assignment.class_grade_category&.name
        props[:class_type] = assignment.classroom.type
        props[:status] = assignment.status
        props[:grade_status] = grade_by_assignment[assignment.id]&.status

        unless assignment.classroom.viewable_grades.zero?
          props[:grade] = grade_by_assignment[assignment.id]&.number
        end
      end
    end

    def document_props(document)
      {
        id: document.id,
        name: document.name,
        file: document.extension
      }
    end
end
