<?php



namespace Razorpay\Tests;



use Razorpay\Api\Request;



class TransferTest extends TestCase

{

    /**

     * Specify unique transfer id, account id & payment id

     * for example trf_IEn4KYFgfD7q3F, acc_HjVXbtpSCIxENR &

     * pay_I7watngocuEY4P

     */



    private $transferId = "trf_JtBI1uAaDdKkpJ";



    private $accountId = "acc_HjVXbtpSCIxENR";



    private $paymentId = "pay_LdarHRbodWJeXO";



    public function setUp(): void

    {

        parent::setUp();

    }

    

    /**

    * Direct transfers

    */

    public function testDirectTransfer()

    {

        $data = $this->api->transfer->create(array('account' => $this->accountId, 'amount' => 500, 'currency' => 'INR'));



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('collection',$data->toArray()));

    }



    /**

    * Create transfers from payment

    */

    public function testCreateTransferPayment()

    {

        $data = $this->api->payment->fetch($this->paymentId)->transfer(array('transfers' => array(array('account'=> $this->accountId, 'amount'=> '100', 'currency'=>'INR', 'notes'=> array('name'=>'Gaurav Kumar', 'roll_no'=>'IEC2011025'), 'linked_account_notes'=>array('branch'), 'on_hold'=>'1', 'on_hold_until'=>'1671222870'))));



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('collection',$data->toArray()));

  

    }



    /**

    * Create transfers from order

    */

    public function testCreateTransferOrder()

    {

       $data = $this->api->order->create(array('amount' => 100,'currency' => 'INR','transfers' => array(array('account' =>$this->accountId,'amount' => 100,'currency' => 'INR','notes' => array('branch' => 'Acme Corp Bangalore North','name' => 'Gaurav Kumar'),'linked_account_notes' => array('branch'),'on_hold' => 1,'on_hold_until' => 1671222870))));



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('transfer',$data->toArray()));

    }



    /**

    * Fetch transfer for a payment

    */

    public function testFetchTransferPayment()

    {

       $data = $this->api->payment->fetch($this->paymentId)->transfers();



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('collection',$data->toArray()));

    }



    /**

    * Fetch transfer for an order

    */

    public function testFetchTransferOrder()

    {

        $order = $this->api->order->all();



        if($order['count'] !== 0){



            $data = $this->api->order->fetch($order['items'][0]['id'])->transfers(array('expand[]'=>'transfers'));



            $this->assertTrue(is_array($data->toArray()));



            $this->assertTrue(in_array('order',$data->toArray()));

        }

    }

    

    /**

    * Fetch transfer

    */

    public function testFetchTransfer()

    {



        $data = $this->api->transfer->fetch($this->transferId);



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('order',$data->toArray()));

    }



    /**

    * Fetch transfers for a settlement

    */

    public function testFetchSettlement()

    {

        $settlement = $this->api->transfer->all(array('expand[]'=> 'recipient_settlement'));



        if($settlement['count'] !== 0){



            $data = $this->api->transfer->all(array('recipient_settlement_id'=> $settlement['items'][0]['recipient_settlement_id']));



            $this->assertTrue(is_array($data->toArray()));



        }  

    }



    /**

    * Fetch settlement details

    */

    public function testFetchSettlementDetails()

    {

        $data = $this->api->transfer->all(array('expand[]'=> 'recipient_settlement'));

     

        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('collection',$data->toArray()));

          

    }



    /**

    * Refund payments and reverse transfer from a linked account

    */

    public function testRefundPayment()

    {

        $data = $this->api->payment->fetch($this->paymentId)->refund(array('amount'=> '100'));

        

        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('refund',$data->toArray()));

    }



    /**

    * Fetch payments of a linked account

    */

    public function testFetchPaymentsLinkedAccounts()

    {

        $data = $this->api->payment->fetch($this->paymentId)->refund(array('amount'=> '100'));

    

        $this->assertTrue(is_array($data->toArray()));

    }



    /**

    * Reverse transfers from all linked accounts

    */

    public function testReverseLinkedAccount()

    {

        $transfer = $this->api->transfer->create(array('account' => $this->accountId, 'amount' => 100, 'currency' => 'INR'));



        $data = $this->api->transfer->fetch($transfer->id)->reverse(array('amount'=>100));



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('refund',$data->toArray()));

    }



    /**

    * Hold settlements for transfers

    */

    public function testHoldSettlements()

    {

        $data = $this->api->payment->fetch($this->paymentId)->transfer(array('transfers' => array(array('account' => $this->accountId, 'amount' => '100', 'currency' => 'INR', 'on_hold'=>'1'))));

        

        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('collection',$data->toArray()));

    }



    /**

    * Modify settlement hold for transfers

    */

    public function testModifySettlements()

    {

        $data = $this->api->transfer->fetch($this->transferId)->edit(array('on_hold'=>1));



        $this->assertTrue(is_array($data->toArray()));



        $this->assertTrue(in_array('transfer',$data->toArray()));

    }

}