class Csv::EdFi::Indiana::AccommodationsService < Csv::ApplicationService
  include EdFi::IndianaHelper

  def initialize(school_id)
    @school_id = school_id
  end

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

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

    def grades
      @grades ||= school.grades_hash
    end

    def grades_mapped_ungraded
      school.grades.where(edfi_grade: -4).pluck(:grade)
    end

    def accommodations
      school.current_year.ed_fi_accommodations
        .includes(:student)
    end

    def accommodation_descriptors
      @accommodation_descriptors ||= descriptor_service(
        school.current_year.id,
        descriptor: :accommodationDescriptors
      )
        .map { |d| [d['id'], d['shortDescription']] }
        .to_h
    end

    def academic_subject_descriptors
      @academic_subject_descriptors ||= descriptor_service(
        school.current_year.id,
        descriptor: :academicSubjectDescriptors
      )
        .map { |d| [d['id'], d['shortDescription']] }
        .to_h
    end

    def headers
      arr = [
        'Student Grade',
        'Student Last Name',
        'Student First Name',
        'Student State ID',
        'Assessment Type',
        'Accommodation Descriptor'
      ]
      if school.find_or_build_ed_fi_indiana_environment.environment == 'sandbox'
        arr << 'Academic Subject Descriptor'
      end
      arr
    end

    def props(accommodation)
      student = accommodation.student
      obj = [
        grades[student.grade],
        student.last_name,
        student.first_name,
        student.state_id,
        accommodation.decorate.assessment_label,
        accommodation_descriptors[accommodation.accommodation_descriptor]
      ]
      if school.find_or_build_ed_fi_indiana_environment.environment == 'sandbox'
        obj << academic_subject_descriptors[accommodation.academic_subject_descriptor]
      end
      obj
    end
end
