<?php

declare(strict_types=1);

namespace App\Jobs\Paynl;

use App\Models\Merchant;
use App\Models\Transaction;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

final class StoreTransactionsAndAttachToMerchant implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;
    use SerializesModels;

    public function __construct(
        protected array $paymentMethods,
        protected Merchant $merchant,
    ) {
    }

    public function handle(): void
    {
        $transactions = [];

        foreach ($this->paymentMethods as $paymentMethod) {
            $dateFrom = Carbon::now()->subMonths(3)->startOfMonth();
            $dateUntil = Carbon::now()->subMonth()->endOfMonth();

            $exists = Transaction::query()
                ->where([
                    'date_from' => $dateFrom,
                    'date_until' => $dateUntil,
                    'merchant_id' => $this->merchant->id,
                    'payment_method_id' => $paymentMethod['id'],
                ])
                ->exists();

            if (!$exists) {
                $transactions[] = [
                    'payment_method_id' => $paymentMethod['id'],
                    'payment_method_name' => strtolower($paymentMethod['name']),
                    'amount_of_transactions' => (int) $paymentMethod['transactions'],
                    'turnover' => floatval($paymentMethod['turnover']),
                    'date_from' => $dateFrom,
                    'date_until' => $dateUntil,
                ];
            }
        }

        $this->merchant->transactions()->createMany($transactions);
    }
}
