# frozen_string_literal: true

namespace :ofn do
  namespace :subs do
    namespace :test do
      desc "Repeat placement job for a specific Order Cycle"
      task repeat_placement_job: :environment do
        puts "WARNING: this task will generate new, and potentially duplicate, customer orders"
        exit_in_production

        order_cycle_id = request_order_cycle_id

        # Open Order Cycle by moving close_at to the future and open_at to the past
        set_order_cycle_times(
          order_cycle_id,
          15.minutes.ago,
          15.minutes.from_now
        )

        # Reset Proxy Orders of the Order Cycle
        #   by detatching them from existing orders and resetting placed and confirmed dates
        ProxyOrder.find_by(order_cycle_id:)&.update!(
          order_id: nil,
          confirmed_at: nil,
          placed_at: nil
        )

        # Run placement job to create orders
        SubscriptionPlacementJob.perform_now
      end

      desc "Force confirmation job for a specific Order Cycle"
      task force_confirmation_job: :environment do
        puts "WARNING: this task will process payments in customer orders"
        exit_in_production

        order_cycle_id = request_order_cycle_id

        # Close Orde Cycle by moving close_at to the past
        set_order_cycle_times(
          order_cycle_id,
          30.minutes.ago,
          15.minutes.ago
        )

        # Run Confirm Job to process payments
        SubscriptionConfirmJob.perform_now
      end

      def exit_in_production
        return unless Rails.env.production?

        puts "Oops, we are in production environment. Exiting."
        exit
      end

      def set_order_cycle_times(order_cycle_id, open_at, close_at)
        OrderCycle.find(order_cycle_id).update!(
          orders_open_at: open_at,
          orders_close_at: close_at
        )
      end

      def request_order_cycle_id
        puts "Please input Order Cycle ID to reset"
        input = $stdin.gets.chomp
        exit if input.blank? || !Integer(input)
        Integer(input)
      end
    end
  end
end
