<?php

namespace Yajny\Member\BalanceTransactions;

use Yajny\Member\Entities\BalanceTransactions\MappedTransaction;
use Yajny\Member\Entities\BalanceTransactions\RawTransaction;
use Yajny\Member\Entities\BalanceTransactions\TransactionsBalanceTypeUtil;
use Yajny\Member\Entities\BalanceTransactions\TransactionSourceTypes;
use Yajny\Member\Entities\BalanceTransactions\TransactionTypes;
use Yajny\Member\Entities\BalanceTransactions\UserBalanceCalculationObject;
use Yajny\Member\Exceptions\InvalidBonusStatusException;

class BonusBalanceTransaction extends BalanceTransactionFactory
{
    private $bonusID;
    private $bonusStatus;
    private $bonusTime;
    public $eligibleSourceType = TransactionSourceTypes::BONUS;

    public function __construct($userID, $transactionAmount, $bonusID, $bonusStatus, $bonusTime)
    {
        parent::__construct($userID, $transactionAmount);
        $this->bonusID = $bonusID;
        $this->bonusStatus = $bonusStatus;
        $this->bonusTime = $bonusTime;
    }

    public function initTransaction(): RawTransaction
    {
        return new RawTransaction($this->userID, $this->transactionAmount, $this->bonusStatus, TransactionSourceTypes::BONUS, $this->bonusID);
    }

    /**
     * @param UserBalanceCalculationObject $user_balance
     * @param RawTransaction $raw_transaction
     * @return MappedTransaction
     * @throws InvalidBonusStatusException
     */
    public static function mapRawTransactionToTransaction(UserBalanceCalculationObject $user_balance, RawTransaction $raw_transaction): MappedTransaction
    {

        switch ($raw_transaction->status) {
            case 'declined':
                $balance_type = TransactionsBalanceTypeUtil::PENDING;       // 90% of the declined cases comes from pending state
                $transaction_type = TransactionTypes::DECLINED_BONUS;
                $amount = 0;
                break;
            case 'confirmed':
                $balance_type = TransactionsBalanceTypeUtil::CONFIRMED;
                $transaction_type = TransactionTypes::CONFIRMED_BONUS;
                $amount = (float)$raw_transaction->amount;
                $user_balance->confirmed_balance += $amount;
                break;
            case 'pending':
                $balance_type = TransactionsBalanceTypeUtil::PENDING;
                $transaction_type = TransactionTypes::PENDING_BONUS;
                $amount = (float)$raw_transaction->amount;
                $user_balance->pending_balance += $amount;
                break;
            default:
                throw new InvalidBonusStatusException();
        }

        return new MappedTransaction(
            $raw_transaction->user_id,
            $transaction_type,
            TransactionSourceTypes::BONUS,
            $raw_transaction->source_id,
            $amount,
            $balance_type,
            $user_balance->pending_balance,
            $user_balance->confirmed_balance,
            $raw_transaction->transaction_time
        );
    }
}