namespace :demo_data do
  desc "Load empty demo dataset (no financial data)"
  task empty: :environment do
    start = Time.now
    skip_clear = ENV.fetch("SKIP_CLEAR", "1") == "1"
    puts "🚀 Loading EMPTY demo data#{skip_clear ? ' (preserving existing data)' : ' (clearing existing data)'}…"

    Demo::Generator.new.generate_empty_data!(skip_clear: skip_clear)

    puts "✅ Done in #{(Time.now - start).round(2)}s"
  end

  desc "Load new-user demo dataset (family created but not onboarded)"
  task new_user: :environment do
    start = Time.now
    skip_clear = ENV.fetch("SKIP_CLEAR", "1") == "1"
    puts "🚀 Loading NEW-USER demo data#{skip_clear ? ' (preserving existing data)' : ' (clearing existing data)'}…"

    Demo::Generator.new.generate_new_user_data!(skip_clear: skip_clear)

    puts "✅ Done in #{(Time.now - start).round(2)}s"
  end

  desc "Load full realistic demo dataset"
  task default: :environment do
    start    = Time.now
    seed     = ENV.fetch("SEED", Random.new_seed)
    skip_clear = ENV.fetch("SKIP_CLEAR", "1") == "1"
    puts "🚀 Loading FULL demo data (seed=#{seed})#{skip_clear ? ' (preserving existing data)' : ' (clearing existing data)'}…"

    generator = Demo::Generator.new(seed: seed)
    generator.generate_default_data!(skip_clear: skip_clear)

    validate_demo_data

    elapsed = Time.now - start
    puts "🎉 Demo data ready in #{elapsed.round(2)}s"
  end

  # ---------------------------------------------------------------------------
  # Validation helpers
  # ---------------------------------------------------------------------------
  def validate_demo_data
    total_entries   = Entry.count
    trade_entries   = Entry.where(entryable_type: "Trade").count
    categorized_txn = Transaction.joins(:category).count
    txn_total       = Transaction.count

    coverage = ((categorized_txn.to_f / txn_total) * 100).round(1)

    puts "\n📊 Validation Summary".ljust(40, "-")
    puts "Entries total:              #{total_entries}"
    puts "Trade entries:             #{trade_entries} (#{trade_entries.between?(500, 1000) ? '✅' : '❌'})"
    puts "Txn categorization:        #{coverage}% (>=75% ✅)"

    unless total_entries.between?(8_000, 12_000)
      puts "Total entries #{total_entries} outside 8k–12k range"
    end

    unless trade_entries.between?(500, 1000)
      puts "Trade entries #{trade_entries} outside 500–1 000 range"
    end

    unless coverage >= 75
      puts "Categorization coverage below 75%"
    end
  end
end

# Alias namespace to avoid forgetfulness
namespace :sample_data do
  desc "Load full realistic demo dataset (alias for demo_data:default)"
  task default: "demo_data:default"
end
