<?php

namespace App\Classes\Jobs;

use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject;
use App\Models\Transaction;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;

class UpdatePerfexCRMPrelude implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /** @var Transaction */
    private $transaction;

    /** @var UpdatePerfexCRMObject */
    private $updatePerfexCRMObject;

    /** @var Boolean|null */
    private $shouldCreateInvoice;

    /**
     * @param Transaction $transaction
     * @param UpdatePerfexCRMObject $updatePerfexCRMObject
     * @param bool|null $shouldCreateInvoice
     */
    public function __construct(Transaction $transaction, UpdatePerfexCRMObject $updatePerfexCRMObject, ?bool $shouldCreateInvoice = false)
    {
        $this->transaction = $transaction;
        $this->updatePerfexCRMObject = $updatePerfexCRMObject;
        $this->shouldCreateInvoice = $shouldCreateInvoice;
    }


    public function handle()
    {
        $serviceTypeName = $this->transaction->owner->company->services()->where('id', $this->transaction->owner->service_id)->first()->name;
        $booking = $this->transaction->booking;
        $bankDetails = $this->generateBankDetails($booking->bank);

        $data = [
            'amount' => number_format($this->transaction->amount, 2, '.', ''),
            'currency' => $this->transaction->currency_id == 1 ? "MYR" : "CNY",
            'service_type' => $serviceTypeName,
            'bank_details' => $bankDetails,
            'link_transfer' => config('app.url').'/transfer/'.$this->transaction->owner->marking,
            'link_payments' => config('app.url').'/payments',
            'link_autocount_or' => 'https://docs.google.com/spreadsheets/d/1Q3rJBGQ9Bo04HZp5WR9zbLp7pIW2kfDYsabxG7JON-4/edit#gid=2013983170',
        ];

        $result = $this->replacePlaceholders($this->updatePerfexCRMObject->getTasks(), $data);
        $this->updatePerfexCRMObject->setTasks($result);

        UpdatePerfexCRM::dispatch($this->updatePerfexCRMObject, $this->transaction, $this->shouldCreateInvoice);
    }


    private function generateBankDetails($bank): array
    {
        return $this->transaction->owner->service_id == 4 ?
            [
                '1688_username' => $bank->account_no,
                '1688_password' => $bank->holder_name,
                'payment_pin' => $bank->bank_branch,
            ]:
            [
                'id' => $bank->id,
                'type' => $bank->type,
                'reference' => $bank->reference,
                'bank_name' => $bank->bank_name,
                'bank_branch' => $bank->bank_branch,
                'holder_name' => $bank->holder_name,
                'account_no' => $bank->account_no,
                'country_id' => $bank->country_id,
                'default' => $bank->default,
                'status' => $bank->status,
            ];
    }


    function replacePlaceholders($template, $data, $prefix = '')
    {
        foreach ($template as $key => $value) {
            foreach ($data as $dataKey => $dataValue) {
                if (is_array($dataValue)) {
                    $template[$key] = $this->replacePlaceholders($template[$key], $dataValue, $dataKey);
                } else {
                    if ($prefix != '') {
                        $template[$key] = str_replace('{' .$prefix. "." .$dataKey . '}', $dataValue, $template[$key]);
                    } else {
                        $template[$key] = str_replace('{' . $dataKey . '}', $dataValue, $template[$key]);
                    }
                }
            }
        }

        return $template;
    }

}
