Currently, there ain't native way to do that but you can use blade render event to pass some javascript explicitly.
With that javascript you need to inject your required things such as HTML also from script itself.

Ways to pass JS:

@push('scripts')
//JS code
@endpush

Use listener to listen event "bagisto.admin.layout.body.after" for admin and "bagisto.shop.layout.body.after" for shop.
Using these events you can pass any blade file with your script and html either or both.

Well, to add extra conditions of your choice will be a bit tough to implement but in next release we will add a provision to inflict rules with outer system conditions that will resolve to boolean outputs only.

But for your current bagisto version you can apply and create a new action by pushing a new Action class in config('discount-rule.cart') and make a new action class or override the previous classes and place your customer first sale condition.

And remember the key is zero discount never gets presented on cart they are ignored.

To do for products you have to take a deep dive in productRepository class present in product package. It already have create and update methods inside it. To create a product you would be needed to select three things:
a. SKU
b. Attribute Family
c. Select variants if you are creating congurable product.

Both the methods create and update in productRepository should work simultaneously if you want to create a product at one go.

To create products with faker you will just need to inject productRepository class and then create products with all necessary values used as it.