# frozen_string_literal: true

require 'highline'
require 'tasks/data/truncate_data'

# This task can be used to significantly reduce the size of a database
#   This is used for example when loading live data into a staging server
#   This way the staging server is not overloaded with too much data
#
# This is also aimed at implementing data archiving. We assume data older than
# 2 years can be safely removed and restored from a backup. This gives room for
# hubs to do their tax declaration.
#
# It's a must to perform a backup right before executing this. Then, to allow
# for a later data recovery we need to keep track of the exact moment this rake
# task was executed.
#
# Execute this in production only when the instance users are sleeping to avoid any trouble.
#
# Example:
#
# $ bundle exec rake "ofn:data:truncate[24]"
#
# This will remove data older than 2 years (24 months).
namespace :ofn do
  namespace :data do
    desc 'Truncate data'
    task :truncate, [:months_to_keep] => :environment do |_task, args|
      warn_with_confirmation

      TruncateData.new(args.months_to_keep).call
    end

    def warn_with_confirmation
      message = <<~MSG
        \n
        <% highlighted_message = "This will permanently change DB contents. This is not meant to be run in production as it needs more thorough testing." %>
        <%= color(highlighted_message, :blink, :on_red) %>
        Are you sure you want to proceed? (y/N)
      MSG

      exit unless HighLine.new.agree(message) { |question| question.default = "N" }
    end
  end
end
