class Csv::EdFi::Indiana::AttendanceService < Csv::ApplicationService
  def initialize(school_id)
    @school_id = school_id
  end

  def call
    CSV.generate do |csv|
      csv << headers
      attendances.each { |a| csv << props(a) }
    end
  end

  private
    def school
      @school ||= School.find(@school_id)
    end

    def school_config
      @school_config ||= school.school_config
    end

    def grades
      @grades ||= school.grades_hash
    end

    def students_with_edfi_ids
      school.current_year.school_year_students.where.not(edfi_id: '').pluck(:student_id)
    end

    def attendances
      @attendances = school.current_year.attendances
        .joins(:student)
        .preload(:student, :type, :type_2, :ed_fi_ids)

      @attendances
        .with_type_or_type_2
        .where(homeroom: true)
        .where(student_id: students_with_edfi_ids)
        .distinct
        .merge(Student.order(:code))
    end

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

    def headers
      [
        'Student Code',
        'Last Name',
        'First Name',
        'Grade',
        'StateID',
        'Date',
        'Present from Attendance',
        'Absent from Attendance',
        'Type from Attendance',
        'Type 2 from Attendance'
      ]
    end

    def props(attendance)
      student = attendance.student
      [
        student.code,
        student.last_name,
        student.first_name,
        grades[student.grade],
        student.state_id,
        attendance.date.strftime('%m/%d/%Y'),
        attendance.is_present? ? 1 : 0,
        attendance.absent? ? 1 : 0,
        attendance_descriptors[attendance.type&.state_category_descriptor],
        attendance_descriptors[attendance.type_2&.state_category_descriptor]
      ]
    end
end
