class Csv::Settings::PermissionsCsv < Csv::ApplicationService
  def initialize(school)
    @school = school
  end

  def call
    CSV.generate do |csv|
      csv << headers
      employees.each { |e| csv << employee_row(e) }
    end
  end

  private
    def headers
      ['User ID', 'School-issued ID', 'Name'] + modules.map { |m| AdminPermission::NAMES[m.to_sym] }
    end

    def modules
      @modules ||= AdminPermission.column_names - inactive_attributes
    end

    def employees
      @school.employees.is_current(true).includes(:school_number).ordered
    end

    def employee_row(employee)
      array = [employee.id, employee.school_number&.number, employee.full_name(:reverse)]
      array + employee_permissions(employee).values.map(&:titleize)
    end

    def employee_permissions(employee)
      employee.find_or_build_admin_permission.attributes.except!(*inactive_attributes)
    end

    def inactive_attributes
      array = [
        'id',
        'user_id',
        'created_at',
        'updated_at',
        'communication',
        'library',
        'pt_conference',
        'classroom',
        'courses'
      ]
      array += @school.employee_module.inactive_modules
      array << 'state_reporting' unless @school.ed_fi_system_indiana?
      array
    end
end
