class Csv::Service::LogExportService < Csv::ApplicationService
  include DateRangeHelper

  def initialize(school, params)
    @school = school
    @type = params['type']
    @dates = params['dates']
  end

  def call
    CSV.generate do |csv|
      csv << [
        'Date',
        "#{@type.capitalize} Code",
        @type.capitalize,
        'Service',
        'Notes',
        'Hours',
        'Status',
        'School Year',
        'Created At'
      ]
      logs_props.each { |l| csv << l }
    end
  end

  private
    def family_logs
      @family_logs ||= @school.service_family_logs
        .includes(:opportunity)
        .preload(:school_year)
        .by_date_range(date_range(@dates))
        .order(:datetime)
        .decorate
    end

    def student_logs
      @student_logs ||= @school.service_student_logs
        .includes(:opportunity)
        .preload(:school_year)
        .by_date_range(date_range(@dates))
        .order(:datetime)
        .decorate
    end

    def logs_props
      if @type == 'family'
        family_logs.map do |log|
          [
            log.datetime&.strftime('%m/%d/%Y'),
            log.family&.code,
            log.family&.name,
            log.opportunity_name,
            log.notes,
            log.hours,
            log.status,
            log.school_year&.name,
            log.created_at_or_created_dt&.strftime('%m/%d/%Y, %I:%M %p')
          ]
        end
      else
        student_logs.map do |log|
          [
            log.datetime&.strftime('%m/%d/%Y'),

            log.student&.code,
            log.student&.full_name(:reverse),
            log.opportunity_name,
            log.notes,
            log.hours,
            log.status,
            log.school_year&.name,
            log.created_at_or_created_dt&.strftime('%m/%d/%Y, %I:%M %p')
          ]
        end
      end
    end
end
