# frozen_string_literal: true module Granblue class DataImporter def initialize(test_mode: false, verbose: false) @test_mode = test_mode @verbose = verbose @import_logs = [] end def process_all_files(&block) files = Dir.glob(Rails.root.join('db', 'seed', 'updates', '*.csv')).sort files.each do |file| if (new_records = import_csv(file)) block.call(new_records) if block_given? end end print_summary if @test_mode end private def import_csv(file_path) filename = File.basename(file_path) return if already_imported?(filename) importer = create_importer(filename, file_path) return unless importer log_info "Processing #{filename} in #{@test_mode ? 'test' : 'live'} mode..." result = importer.import log_import(filename, result) log_info "Successfully processed #{filename}" result end def log_import_results(result) return unless @verbose result[:new].each do |type, ids| log_info "Created #{ids.size} new #{type.pluralize}" if ids.any? end result[:updated].each do |type, ids| log_info "Updated #{ids.size} existing #{type.pluralize}" if ids.any? end end def create_importer(filename, file_path) # This pattern matches both singular and plural: character(s), weapon(s), summon(s) match = filename.match(/\A\d{8}-(character(?:s)?|weapon(?:s)?|summon(?:s)?)-\d+\.csv\z/) return unless match matched_type = match[1] singular_type = matched_type.sub(/s$/, '') importer_class = "Granblue::Importers::#{singular_type.capitalize}Importer".constantize importer_class.new( file_path, test_mode: @test_mode, verbose: @verbose, logger: self ) rescue NameError log_info "No importer found for type: #{singular_type}" nil end def already_imported?(filename) DataVersion.imported?(filename) end def log_import(filename, result = nil) return if @test_mode DataVersion.mark_as_imported(filename) if result && @verbose result[:new].each do |type, ids| log_info "Created #{ids.size} new #{type.pluralize}" if ids.any? end result[:updated].each do |type, ids| log_info "Updated #{ids.size} existing #{type.pluralize}" if ids.any? end end end def log_operation(operation) if @test_mode @import_logs << operation log_info "[TEST MODE] Would perform: #{operation}" end end def print_summary log_info "\nTest Mode Summary:" log_info "Would perform #{@import_logs.size} operations" if @import_logs.any? log_info 'Sample of operations:' @import_logs.first(3).each { |log| log_info "- #{log}" } log_info '...' if @import_logs.size > 3 end end def log_info(message) puts message if @verbose || @test_mode end end end