<?php

abstract class PaymentInterface
{

    abstract public function setLocale($locale);
    abstract public function getDisplayName();
    abstract public function getConfigParams();
    abstract public function setConfig($arrConfig);
    abstract public function validateConfig($arrConfig);
    abstract public function getPaymentChoiceTemplate();
    abstract public function validateAndSetPaymentChoice($arrParams);

    /**
     *
     * @param OrderData $order
     * @param $requestParams
     * @return @var PaymentResult
     */
    abstract public function doPayment(OrderData $order, array $requestParams);

    /**
     *
     * @param OrderData $order
     * @param $requestParams
     * @return @var PaymentResult
     */
    public function serverToServerCallback(OrderData $order, array $requestParams) {
        return 'Error! Server to server callback not implemented.';
    }

    static public function getReturnURL() {
        return URLPFAD . 'themes/bestellen/paymentReturn.php';
    }

    public function getServerToServerCallbackURL() {
        return URLPFAD . 'themes/bestellen/paymentS2SCallback.php?paymentinterface=' . get_class($this);
    }

    /**
     *
     * @param $requestParams
     * @return string
     */
    static public function parseServerToServerCallback($requestParams) {
        return false;
    }

    static $stdPluginCaps = array(
        'createInvoice' => false,
        'checkPending' => false,
        'changeOrder' => false,
        'cancelPayment' => false,
        'plugin_version' => '1.0'
    );

    static public function getPluginCaps($feature = false) {
        if($feature) {
            return self::$stdPluginCaps[$feature];
        } else {
            return self::$stdPluginCaps;
        }
    }

    public function createInvoicePDF($outputFile, $order, $freeFieldValue) {
        return false;
    }

    /**
     * @param OrderData $order
     * @param $freeFieldValue
     * @return bool
     */
    public function checkPending($order, $freeFieldValue) {
        return false;
    }

    /**
     * @param OrderData $order
     * @param $freeFieldValue
     * @return bool
     */
    public function changeOrder($order, $freeFieldValue) {
        return false;
    }

    /**
     * @param OrderData $order
     * @param $freeFieldValue
     * @return bool
     */
    public function cancelPayment($order, $freeFieldValue) {
        return false;
    }
}

class ParamCfg {

    const TYPE_STRING = 0;
    const TYPE_CHECK = 1;
    const TYPE_SELECT = 2;
    const TYPE_DATE = 3;

    public $name;
    public $displayName;
    public $type;
    public $values;

    public function __construct($name, $displayName, $type, $values = false) {
        $this->name = $name;
        $this->displayName = $displayName;
        $this->type = $type;
        $this->values = $values;
    }
}

class Param {
    public $name;
    public $value;
}

class PaymentResult {
    const PAYMENT_COMPLETE = 1;
    const PAYMENT_FAILED = 2;
    const PAYMENT_PENDING = 3;
    const REDIRECT_REQUIRED = 4;
    const IFRAME_REQUIRED = 5;
    const POPUP_REQUIRED = 6;
    const IFRAME_GET_REQUIRED = 7;
    const REDIRECT_GET_REQUIRED = 8;

    public $result;
    public $targetURL;
    public $postArray;
    public $message;
    public $freeField;
    public $freeFieldName;
    public $orderIdentifierValue;
    public $serverToServerReply;

    public function __construct($result, $targetURL = '', $postArray = array(), $message = '', $freeFieldName = '', $freeField = '', $additionalField1 = '', $additionalField2 = '', $orderIdentifierValue = '', $serverToServerReply = '') {
        $this->result = $result;
        $this->targetURL = $targetURL;
        $this->postArray = $postArray;
        $this->message = $message;
        $this->freeField = $freeField;
        $this->freeFieldName = $freeFieldName;
        $this->orderIdentifierValue = $orderIdentifierValue;
        $this->serverToServerReply = $serverToServerReply;
    }
}

class CountryData {
    public $name;
    public $isocode;
}

class StateData {
    public $name;
    public $code;
}

class AddressData {
    public $firstName;
    public $lastName;
    public $street;
    public $houseNumber;
    public $zipCode;
    public $city;
    /** @var CountryData */
    public $country;
    /** @var StateData */
    public $state;

}

class CustomerData {
    public $customerID;
    public $phone;
    public $email;
    public $gender; // 'm', 'f' or 'u'

    const END_CUSTOMER = 1;
    const BUSINESS_CUSTOMER = 2;
    const FOREIGN_CUSTOMER = 3;
    public $type;

    /** @var AddressData */
    public $invoiceAddress;
    /** @var AddressData */
    public $deliveryAddress;
}

class CurrencyData {
    public $ISOCode;
    public $symbol;
}

class CartItem {
    public $name;
    public $number;
    public $quantity;
    public $amount;
    public $vat;
}

class DiscountData {
    public $name;
    public $amount;
    public $percent;
}

class VoucherData {
    public $name;
    public $amount;
    public $code;
}

class OrderData {

    public $orderID;
    public $orderNumber;
    /** @var CustomerData */
    public $customer;
    /** @var CurrencyData */
    public $currency;
    /** @var CartItem[] */
    public $cartItems = array();
    public $itemAmount;
    /** @var DiscountData */
    public $discount;
    /** @var VoucherData */
    public $voucher;
    public $totalAmount;
    public $shippingFeeAmount;
    public $paymentFeeAmount;
    public $taxAmount;
    public $amountsAreGross;
}
?>
