class PushUpgradeWorker
  include Sidekiq::Worker
  sidekiq_options queue: :push_upgrade, retry: false, backtrace: true

  def perform(mac_id, upgrade_id)
    redis_key = "AP:#{mac_id}"
    $redis.hset(redis_key, "upgrade_job_id", self.jid)  # Save job ID in Redis

    upgrade = Upgrade.find_by(id: upgrade_id)
    return unless upgrade

    return if $redis.hget(redis_key, "ongoing_upgrade") == "true"

    if $redis.hget(redis_key, "pending_upgrade").present?
      upgrade_uuid = $redis.hget(redis_key, "upgrade_uuid")
      if upgrade.status == "waiting for response" && upgrade_uuid.present?
        res = call_commands_api(upgrade, upgrade_uuid, mac_id)
        if res['status'] == 'completed'
          upgrade.update_columns(status: "sent", updated_at: Time.zone.now)
          $redis.hdel(redis_key, "pending_upgrade")
          $redis.hdel(redis_key, "upgrade_uuid")
          $redis.hdel(redis_key, "ongoing_upgrade")
        elsif res['status'] == 'timeout' || res['status'] == 'pending'
          upgrade.set_redis
        end
      else
        upgrade.set_redis
      end
    end
  ensure
    $redis.hdel(redis_key, "upgrade_job_id")
  end

  def call_commands_api(upgrade, upgrade_uuid, mac_id)
    response = OpenWifi::ProvisioningService.new(upgrade.router_inventory.location_network, upgrade.router_inventory.organisation).get_uuid_command(upgrade_uuid, mac_id)
    Rails.logger.info "[OPENWIFI][UPGRADE] Received response from commands API: #{response.inspect}"
    response
  rescue => e
    Rails.logger.error "[OPENWIFI][UPGRADE] Error fetching commands API: #{e.message}"
    $redis.hdel("AP:#{mac_id}", "ongoing_upgrade")
    {}
  end
end
