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

  def show
    render_success :ok, json: transcript_service.find_record(params[:id])
  end

  def destroy
    if params[:id]
      transcript_service.delete(params[:id])
      render_success :ok, json: { success: true }
    else
      render_error :unprocessable_entity, json: { success: false }
    end
  end

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

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

    def transcript_service
      dir = "#{current_school.indiana_environment_service}::CourseTranscriptService"
      dir.constantize.new(
        current_school_year.id,
        student: student
      )
    end

    def terms
      @terms ||= if current_school.school_config.semesters?
        { 1 => 'Fall Semester', 2 => 'Spring Semester' }
      else
        {
          1 => 'First Trimester',
          2 => 'Second Trimester',
          3 => 'Third Trimester',
        }
      end
    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 { |c| [c.course_number, c.id] }
    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 { |s| [s.code, s.id] }
    end

    def props(record)
      course_code = record[:courseCode].to_s
      section_id = record[:sectionIdentifier].to_i
      associated = ed_fi_classes[[course_code, section_id]] ||
        class_subjects[[course_code, section_id]]
      {
        id: record[:id],
        code: course_code,
        course_attempt_result_descriptor: record[:courseAttemptResultDescriptor],
        session_name: record[:sessionName],
        section_identifier: section_id,
        name: associated&.name,
        class_id: associated&.id
      }
    end
end
