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
      EdFi::Indiana::Sandbox::CourseTranscriptService.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(&: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 props(record)
      associated = ed_fi_classes[record[:code]] || class_subjects[record[:code]]
      classroom = associated.is_a?(ClassSubject) ? associated.classroom : associated
      term = classroom.period_long? ? 'Year Round' : terms[classroom.semester]
      {
        id: record[:id],
        code: record[:code],
        courseAttemptResultDescriptor: record[:courseAttemptResultDescriptor],
        session_name: "#{current_school_year.academic_year} #{term}",
        name: associated&.name,
        class_id: associated&.id
      }
    end
end
