<?php

namespace Razorpay\Tests;

use Razorpay\Api\Request;

class PaymentLinkTest extends TestCase
{
    /**
     * Specify unique paymentlink id
     * for example plink_IEjOvfQs5AyjMN 
     */
    protected static $paymentLinkId;

    public function setUp(): void
    {
        parent::setUp();
    }
    
    /**
     * Create Payment Link
     */
    public function testCreatePaymentLink()
    {
        $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true,
        'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar',
        'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,
        'reminder_enable'=>true ,'notes'=>array('policy_name'=> 'Jeevan Bima'),'callback_url' => 'https://example-callback-url.com/',
        'callback_method'=>'get'));
        
        self::$paymentLinkId = $data->id;
        $this->cancelLinkId = $data->id;

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

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

    /**
     * Fetch multiple refunds for a payment
     */
    public function testFetchAllMutlipleRefund()
    {
        $data = $this->api->paymentLink->all();

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

        $this->assertTrue(is_array($data['payment_links']));
    }

    /**
     * Fetch a specific refund for a payment
     */
    public function testFetchRefund()
    {
        $data = $this->api->paymentLink->fetch(self::$paymentLinkId);

        $this->assertTrue(is_array($data->toArray()));
        
        $this->assertTrue(in_array('amount',$data->toArray()));
    }

    /**
     * Update Payment Link
     */
    public function testUpdatePaymentLink()
    {
        $payment = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true,
        'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar',
        'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,
        'reminder_enable'=>true ,'notes'=>array('policy_name'=> 'Jeevan Bima'),'callback_url' => 'https://example-callback-url.com/',
        'callback_method'=>'get'));

        $data = $this->api->paymentLink->fetch($payment->id)->edit(array("reference_id"=>"TS".time(), "reminder_enable"=>0, "notes"=>["policy_name"=>"Jeevan Saral 2"]));

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

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

    
    /**
     * Send notification
     */
    public function testSendNotification()
    {
        $data = $this->api->paymentLink->fetch(self::$paymentLinkId)->notifyBy('email');

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

        $this->assertTrue(in_array('success',$data));
    }

    /**
     * Cancel Payment Link
     */
    public function testCancelPaymentLink()
    {
        $paymentLink = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true,
        'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar',
        'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,
        'reminder_enable'=>true ,'notes'=>array('policy_name'=> 'Jeevan Bima'),'callback_url' => 'https://example-callback-url.com/',
        'callback_method'=>'get'));

        $data = $this->api->paymentLink->fetch($paymentLink->id)->cancel();

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

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

    /**
     * Transfer payments received using payment links
     */
    public function testCreateTransferPayments()
    {
        $data = $this->api->paymentLink->create(array('amount'=>20000, 'currency'=>'INR', 'accept_partial'=>false, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('order'=>array('transfers'=>array('account'=>'acc_CPRsN1LkFccllA', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Bhairav Kumar' ,'linked_account_notes'=>array('branch'))), array('account'=>'acc_CNo3jSI8OkFJJJ', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Saurav Kumar' ,'linked_account_notes'=>array('branch')))))));

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

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

    /**
     * Offers on payment links
     */
    public function testOfferPaymentLinks()
    {
        $data = $this->api->paymentLink->create(array('amount'=>20000, 'currency'=>'INR', 'accept_partial'=>false, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('order'=>array('transfers'=>array('account'=>'acc_CPRsN1LkFccllA', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Bhairav Kumar' ,'linked_account_notes'=>array('branch'))), array('account'=>'acc_CNo3jSI8OkFJJJ', 'amount'=>500, 'currency'=>'INR', 'notes'=>array('branch'=>'Acme Corp Bangalore North', 'name'=>'Saurav Kumar' ,'linked_account_notes'=>array('branch')))))));

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

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

    /**
     * Managing reminders for payment links
     */
    public function testManagingRemainder()
    {
        $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>false));

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

        $this->assertTrue(in_array('amount',$data->toArray()));
    }
  
    /**
     * Rename labels in checkout section
     */
    public function testRenameLabelsCheckout()
    {
        $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('partial_payment'=>array('min_amount_label'=>'Minimum Money to be paid', 'partial_amount_label'=>'Pay in parts', 'partial_amount_description'=>'Pay at least ₹100', 'full_amount_label'=>'Pay the entire amount')))));

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

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

    /**
     * Change Business name
     */
    public function testBusinessName()
    {
        $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('name'=>'Lacme Corp'))));

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

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

    /**
     * Change checkouts fields
     */
    public function testCheckoutFields()
    {
        $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('checkout'=>array('method'=>array('netbanking'=>'1', 'card'=>'1', 'upi'=>'0', 'wallet'=>'0')))));

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

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

    /**
     * Rename labels in checkout section
     */
    public function testRenameLabelsPayments()
    {
        $data = $this->api->paymentLink->create(array('amount'=>500, 'currency'=>'INR', 'accept_partial'=>true, 'first_min_partial_amount'=>100, 'description' => 'For XYZ purpose', 'customer' => array('name'=>'Gaurav Kumar', 'email' => 'gaurav.kumar@example.com', 'contact'=>'9000090000'),  'notify'=>array('sms'=>true, 'email'=>true) ,'reminder_enable'=>true , 'options'=>array('hosted_page'=>array('label'=>array('receipt'=>'Ref No.'.time(), 'description'=>'Course Name', 'amount_payable'=>'Course Fee Payable', 'amount_paid'=>'Course Fee Paid', 'partial_amount_due'=>'Fee Installment Due', 'partial_amount_paid'=>'Fee Installment Paid', 'expire_by'=>'Pay Before', 'expired_on'=>'1632223497','amount_due'=>'Course Fee Due'), 'show_preferences'=>array('issued_to'=>false)))));
        
        $this->assertTrue(is_array($data->toArray()));

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