class EdFi::Indiana::V2026::StudentAcademicRecordService <
  EdFi::Indiana::V2026::ApplicationService
  def call
    state_school_year_students.each { |school_year_student| props(school_year_student) }
  end

  def endpoint
    'ed-fi/studentacademicrecords'
  end

  def destroy_logs
    @params[:logs].each(&:destroy)
  end

  private
    def grade_range
      {
        'preschool' => -10..-1,
        'primary' => 0..5,
        'middle' => 6..8,
        'secondary' => 9..12
      }[@params[:grade]]
    end

    def state_school_year_students
      school_year_students.where(grade: grade_range).preload(student: :state_number)
    end

    def terms
      @terms ||= if school.school_config.semesters?
        { 1 => 'Fall Semester', 2 => 'Spring Semester', 3 => 'Year Round' }
      else {
        1 => 'First Trimester',
        2 => 'Second Trimester',
        3 => 'Third Trimester',
        4 => 'Year Round'
      }
      end
    end

    def begin_and_end_days_by_semester
      @begin_and_end_days_by_semester ||= school_year.begin_and_end_days_by_semester
    end

    def student_in_semester?(record, semester)
      return true if terms[semester] == 'Year Round'

      semester_start = begin_and_end_days_by_semester[semester][:begin].date
      semester_end = begin_and_end_days_by_semester[semester][:end].date
      return true if (semester_start..semester_end).cover?(record.entry_date)
      return true if (semester_start..semester_end).cover?(record.exit_date)

      record.entry_date < semester_start &&
        (record.exit_date.nil? || record.exit_date > semester_end)
    end

    def student_is_year_round?(student, term)
      if ['preschool', 'secondary'].include?(@params[:grade])
        student.grade < 9 == (term == 'Year Round')
      else
        true
      end
    end

    def props(school_year_student)
      student = school_year_student.student
      terms.each_key do |term|
        next unless student_is_year_round?(student, terms[term]) &&
          student_in_semester?(school_year_student, term)

        data = {
          educationOrganizationReference: {
            educationOrganizationId: organization_id.number
          },
          schoolYearTypeReference: {
            schoolYear: school_year.academic_year
          },
          studentReference: {
            studentUniqueId: student.state_number&.number
          },
          termDescriptor: "uri://ed-fi.org/TermDescriptor##{terms[term]}"
        }

        rest_client_request(:post, url, student, body: data.to_json)
      end
    end
end
