class Admin::Legacy::Student::Students::Indiana::RostersController <
  Admin::Legacy::Student::Controller
  def show
    if student_id
      render_success :ok, json: compare_records.map { |r| props(r) }
    else
      render_success :ok, json: []
    end
  end

  def update
    if ed_fi_id && params[:nograde] == true
      updated_record = student_service.retrieve_and_update_dex_record(ed_fi_id, {
        "attemptStatusDescriptor" => "uri://doe.in.gov/AttemptStatusDescriptor#No Grade Awarded"
      })
      render_success :ok, json: props(updated_record)
    else
      render_error :unprocessable_entity, json: { success: false }
    end
  end

  def destroy
    if ed_fi_id
      student_service.delete_from_dex(ed_fi_id)
      render_success :ok, json: { success: true }
    else
      render_error :unprocessable_entity, json: { success: false }
    end
  end

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

    def student_id
      @student_id ||= student&.state_number&.number
    end

    def ed_fi_id
      student.ed_fi_ids
        .where(endpoint: 'ed-fi/studentsectionassociations')
        .find_by(number: params[:id])
    end

    def ed_fi_classes
      @ed_fi_classes ||= current_school.classrooms
        .joins(:school_state_classroom)
        .by_type([:period_long])
        .where.not(course_number: ['', ' '])
        .index_by(&:course_number)
    end

    def class_subjects
      @class_subjects ||= current_school.class_subjects
        .joins(classroom: :school_state_classroom)
        .merge(Classroom.by_type([:day_long, :preschool]))
        .where.not(code: ['', ' '])
        .index_by(&:code)
    end

    def roster_service
      EdFi::Indiana::Sandbox::CourseTranscriptService.new(
        current_school_year.id,
        student: student
      )
    end

    def student_service
      EdFi::Indiana::Sandbox::CourseSectionStudentService.new(
        current_school_year.id,
        student: student
      )
    end

    def compare_records
      transcripts = roster_service.find(student_id)
      students = student_service.find(student_id)

      if transcripts.present? && students.present?
        data = []
        transcripts.each do |transcript|
          students.each do |student|
            next unless transcript[:courseCode] == student[:courseCode] &&
              ("#{student[:sessionName].split(' ')[1]} #{student[:sessionName].split(' ')[2]}" ==
                transcript[:termDescriptor].split('#').last)

            data.push(student)
          end
        end
        students - data
      elsif students.present?
        students
      else
        []
      end
    end

    def props(record)
      associated = ed_fi_classes[record[:courseCode]] || class_subjects[record[:courseCode]]
      {
        id: record[:id],
        code: record[:courseCode],
        session_name: record[:sessionName],
        name: associated&.name,
        class_id: associated&.id,
        nograde: record[:attemptStatusDescriptor]&.include?("No Grade Awarded") ? true : false
      }
    end
end
