<?php

namespace Yajny\EventsYj\Library\PayMob;

use Illuminate\Support\Facades\Log;
use Yajny\EventsYj\Exceptions\BankTransactionTypeException;
use Yajny\Member\Entities\Payouts\PayoutStatusUtil;
use Yajny\Member\Models\PayoutMethods;
use Yajny\Member\Models\UserPayoutMethods;
use Yajny\Member\Models\UserPayouts;

class BankTransferPayout extends BasePayMob
{
    public function __construct(UserPayouts $payout = null, UserPayoutMethods $method = null)
    {
        parent::__construct($payout, $method);
        $this->payoutMethod = PayoutMethods::where('code', 'bank-transfer-eg')->firstOrFail();
    }

    function getPayMobDisburseBody()
    {
        switch ($this->method->payout_data->transfer_to) {
            case 'prepaid_card':
                $bankTransactionType = 'prepaid_card';
                break;
            case 'credit_card':
                $bankTransactionType = 'credit_card';
                break;
            case 'debit_card':
            case 'cash_transfer':
                $bankTransactionType = 'cash_transfer';
                break;
            default:
                throw new BankTransactionTypeException();
        }
        return [
            'amount' => $this->payout->local_final_amount,
            'issuer' => 'bank_card',
            'bank_card_number' => $this->payout->account,
            'bank_code' => $this->method->payout_data->bank_code,
            'full_name' => $this->method->payout_data->full_name,
            'bank_transaction_type' => $bankTransactionType,
        ];
    }

    function updateStatus($transaction)
    {
        $currentStatus = $this->payout->status;
        $this->payout->api_status = $transaction->status_code;
        $this->payout->status = $this->payoutMethod->status_mapping[$transaction->status_code] ?? PayoutStatusUtil::FAILED;
        if ($this->payout->status == PayoutStatusUtil::COMPLETED) {
            $this->payout->paid_at = date('Y-m-d');
        }
        if (!isset($this->payoutMethod->status_mapping[$transaction->status_code])) {
            Log::info('Unexpected status_code', compact('transaction'));
        }
        return $currentStatus != $this->payout->status;
    }
}
