class EdFi::Indiana::Sandbox::StudentSchoolAttendanceEvents <
  EdFi::Indiana::Sandbox::ApplicationService
  def call
    attendances.each { |a| props(a) }
  end

  def endpoint
    'ed-fi/studentschoolattendanceevents'
  end

  def delete(id, attendance=nil)
    response = rest_client_request(:delete, "#{url}/#{id.number}", attendance)
    id.delete unless response.nil?
  end

  private
    def students_with_edfi_ids
      school_year.school_year_students.where.not(edfi_id: '').pluck(:student_id)
    end

    def school_year_students
      @school_year_students ||= school_year.school_year_students.group_by(&:student_id)
    end

    def attendances
      @attendances = school_year.attendances
        .left_joins(:ed_fi_ids)
        .preload(:student, :type, :type_2, :ed_fi_ids)

      @attendances
        .where(ed_fi_ids: { id: nil })
        .or(@attendances.where(datetime: 1.week.ago.beginning_of_day..Date.current.end_of_day))
        .with_type_or_type_2
        .where(homeroom: true)
        .where(student_id: students_with_edfi_ids)
        .distinct
    end

    def attendance_descriptors
      @attendance_descriptors ||= EdFi::Descriptor
        .by_attendance_event_category_descriptor(school)
        .map { |e| [e.key, e.code] }
        .to_h
    end

    def props(attendance)
      student_id = attendance.student_id
      skip = true
      school_year_students[student_id]&.each do |year|
        next if attendance.date < year.entry_date
        next if year.exit_date && attendance.date > year.exit_date

        skip = false
      end
      return if skip

      attendance.ed_fi_ids.each { |i| delete(i, attendance) }

      type = attendance.type
      type_2 = attendance.type_2
      same_descriptor = type&.state_category_descriptor == type_2&.state_category_descriptor

      duration = if type && type_2 && !same_descriptor
        0.5
      else
        1
      end

      build_attendance(attendance, duration) if type
      build_attendance(attendance, duration, :type_2) if type_2 && !same_descriptor
    end

    def build_attendance(attendance, duration, type=:type)
      edfi_descriptors = ['Excused Absence', 'In Attendance', 'Tardy', 'Unexcused Absence']
      descriptor = attendance_descriptors[attendance.send(type)&.state_category_descriptor]
      descriptor_url = if edfi_descriptors.include?(descriptor)
        "uri://ed-fi.org/AttendanceEventCategoryDescriptor##{descriptor}"
      else
        "uri://doe.in.gov/AttendanceEventCategoryDescriptor##{descriptor}"
      end
      student = attendance.student
      data = {
        schoolReference: {
          schoolId: state_id.number
        },
        sessionReference: {
          schoolId: state_id.number,
          schoolYear: school_year.academic_year,
          sessionName: "#{school_year.academic_year} Year Round"
        },
        studentReference: {
          studentUniqueId: student.state_id
        },
        attendanceEventCategoryDescriptor: descriptor_url,
        eventDate: attendance.date.strftime('%Y-%m-%d'),
        eventDuration: duration
      }

      response = rest_client_request(:post, url, attendance, body: data.to_json)
      return if response.nil?

      ed_fi_id = response.headers[:location].split('/').last
      descriptor = type == :type ? 1 : 2
      attendance.ed_fi_ids.create(
        number: ed_fi_id,
        endpoint: endpoint,
        descriptor: descriptor,
        school_year: school_year
      )
    end
end
