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

  def initialize(school_id)
    @school_id = school_id
  end

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

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

    def programs
      school.current_year.ed_fi_state_programs
        .joins(:student)
        .includes(:student)
        .order('Students.LastName ASC, Students.FirstName ASC')
    end

    def program_descriptors
      @program_descriptors ||= descriptor_service(
        school.current_year.id,
        descriptor: :programs
      ).index_by { |d| d['id'] }
    end

    def exit_descriptors
      @exit_descriptors ||= descriptor_service(
        school.current_year.id,
        descriptor: :reasonExitedDescriptors
      ).index_by { |d| d['id'] }
    end

    def disability_descriptors
      @disability_descriptors ||= descriptor_service(
        school.current_year.id,
        descriptor: :disabilityDescriptors
      ).index_by { |d| d['id'] }
    end

    def service_descriptors
      @service_descriptors ||= descriptor_service(
        school.current_year.id,
        descriptor: :serviceDescriptors
      ).index_by { |d| d['id'] }
    end

    def grades
      @grades ||= school.grades_hash
    end

    def headers
      arr = [
        'Student Last Name',
        'Student First Name',
        'Student State ID',
        'Grade Level',
        'Program Type',
        'Program Name',
        'Begin Date',
        'End Date',
        'Reason Exited',
        'Primary Exceptionality',
        'Secondary Exceptionality'
      ]
      if school.find_or_build_ed_fi_indiana_environment.environment == 'v2026'
        arr << 'Service Description'
      end
      arr
    end

    def props(program)
      program_descriptor = program_descriptors[program.program_descriptor]
      exit_descriptor = exit_descriptors[program.exit_descriptor]
      disability_descriptor = disability_descriptors[program.disability_descriptor]
      disability_2_descriptor = disability_descriptors[program.disability_2_descriptor]

      obj = [
        program.student.last_name,
        program.student.first_name,
        program.student.state_id,
        grades[program.student.grade],
        program.program.titleize,
        program_descriptor['programName'],
        program.start_date,
        program.end_date,
        program.exit_descriptor? ? exit_descriptor['description'] : nil,
        program.disability_descriptor? ? disability_descriptor['description'] : nil,
        program.disability_2_descriptor? ? disability_2_descriptor['description'] : nil
      ]
      if school.find_or_build_ed_fi_indiana_environment.environment == 'v2026'
        service_descriptor = service_descriptors[program.service_descriptor]
        service_description = program.service_descriptor? ? service_descriptor['description'] : nil

        obj << service_description
      end
      obj
    end
end
