<?php
/*
 * Payment components (only slightly convoluted)
 */

namespace Sakura;

use \PayPal\Api\Payer;
use \PayPal\Api\Item;
use \PayPal\Api\ItemList;
use \PayPal\Api\Details;
use \PayPal\Api\Amount;
use \PayPal\Api\Transaction;
use \PayPal\Api\RedirectUrls;
use \PayPal\Api\Payment;
use \PayPal\Api\PaymentExecution;

class Payments {

    // Container for PayPal API
    private static $paypal;

    // Initialise PayPal API
    public static function init() {

        // Set PayPal object
        try {
            self::$paypal = new \PayPal\Rest\ApiContext(
                new \PayPal\Auth\OAuthTokenCredential(
                    Configuration::getConfig('paypal_client_id'),
                    Configuration::getConfig('paypal_secret')
                )
            );
        } catch(Exception $e) {
            return false;
        }

        return true;

    }

    // Create transaction
    public static function createTransaction($total, $itemName, $transDescription, $returnUrl) {

        // Create the payer object
        $payer = new Payer();

        // Set the method
        $payer->setPaymentMethod('paypal');

        // Create the item
        $item = new Item();

        // Set the item details
        $item   ->setName($itemName)
                ->setCurrency('EUR')
                ->setQuantity(1)
                ->setPrice($total);

        // Create itemlist
        $list = new ItemList();

        // Add the items
        $list->setItems([$item]);

        // Create details
        $details = new Details();

        // Set details
        $details->setSubtotal($total);

        // Create amount
        $amount = new Amount();

        // Set amount data
        $amount ->setCurrency('EUR')
                ->setTotal($total)
                ->setDetails($details);

        // Create transaction
        $trans = new Transaction();

        // Set transaction data (aka shit we already set but whatever who cares we need to set it again 500 times over again anyway, YAY TECHNOLOGY!)
        $trans  ->setAmount($amount)
                ->setItemList($list)
                ->setDescription($transDescription)
                ->setInvoiceNumber(uniqid());

        // Create redirect url object
        $redir = new RedirectUrls();

        // Set redirect url data
        $redir  ->setReturnUrl($returnUrl. '?mode=finish&success=true')
                ->setCancelUrl($returnUrl. '?mode=finish&success=false');

        // Create payment object
        $payment = new Payment();

        // Set payment data (finally)
        $payment->setIntent('sale')
                ->setPayer($payer)
                ->setRedirectUrls($redir)
                ->setTransactions([$trans]);

        // Try to create payment
        try {
            $payment->create(self::$paypal);
        } catch(Exception $ex) {
            return false;
        }

        // Return the approval link if everything is gucci
        return $payment->getApprovalLink();

    }

    // Complete the PayPal transaction
    public static function completeTransaction($paymentId, $payerId) {

        // Attempt to get the payment
        $payment = Payment::get($paymentId, self::$paypal);

        // Create payment execution object
        $execute = new PaymentExecution();

        // Set the payer ID
        $execute->setPayerId($payerId);

        // Attempt to charge the fucker
        try {
            $payment->execute($execute, self::$paypal);
        } catch(Exception $ex) {
            return false;
        }

        // If everything was cute return true
        return true;

    }

}