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

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

  def call
    CSV.generate do |csv|
      csv << ['Name', 'Date', 'Hours']
      log_props.each { |l| csv << l }
    end
  end

  private
    def family_logs
      @family_logs ||= @school.service_family_logs
        .approved
        .includes(:opportunity)
        .by_date_range(date_range(@dates))
        .by_opportunity_ids(@opportunity_id)
        .decorate
    end

    def student_logs
      @student_logs ||= @school.service_student_logs
        .approved
        .includes(:opportunity)
        .by_date_range(date_range(@dates))
        .by_opportunity_ids(@opportunity_id)
        .decorate
    end

    def log_props
      if @type == 'family'
        family_logs.map do |log|
          [
            log.family.name,
            log.datetime.strftime('%m/%d/%Y'),
            log.hours.round(2)
          ]
        end
      else
        student_logs.map do |log|
          [
            log.student.full_name(:reverse),
            log.datetime.strftime('%m/%d/%Y'),
            log.hours.round(2)
          ]
        end
      end
    end
end
