<?php
/**
 * Created by JetBrains PhpStorm.
 * User: mindblast
 * Date: 13.02.14
 * Time: 11:23
 * To change this template use File | Settings | File Templates.
 */

define('MCP__CREDITCARDSERVICE_INTERFACE', 'IMcpCreditcardService_v1_5');


include_once(DATEIPFAD . 'plugins/lib/micropaymentServiceClient/lib/init.php');
include_once(DATEIPFAD . 'plugins/lib/micropaymentServiceClient/services/' . MCP__CREDITCARDSERVICE_INTERFACE . '.php');
require_once( MCP__SERVICELIB_DISPATCHER . 'TNvpServiceDispatcher.php');

class MicropaymentCCWeb extends PaymentInterface
{
    // some constants
    const WEBSERVICE_URL_CH = 'https://billing.micropayment.ch/creditcard/event/';
    const WEBSERVICE_URL_DE = 'https://billing.micropayment.de/creditcard/event/';

    // Language Strings
    private $strings = array(
        'de_DE' => array(
            'displayName' => 'Micropayment Kreditkarte (Web)',
            'testMode' => 'Test Modus',
            'accessKey' => 'Access Key',
            'project' => 'Projektkürzel',
            'server' => 'Server',
            'deutschland' => 'Deutschland',
            'schweiz' => 'Schweiz',
            'ownerName' => 'Kreditkarten Inhaber',
            'cardNumber' => 'Kreditkarten Nummer',
            'expirationDateMonth' => 'gültig bis (Monat)',
            'expirationDateYear' => 'gültig bis (Jahr)',
            'january' => 'Januar',
            'february' => 'Februar',
            'march' => 'März',
            'april' => 'April',
            'may' => 'Mai',
            'june' => 'Juni',
            'july' => 'Juli',
            'august' => 'August',
            'september' => 'September',
            'oktober' => 'Oktober',
            'november' => 'November',
            'december' => 'Dezember',
            'cvvNumber' => 'CVV / CVC',
            'errorOwnerName' => 'Bitte geben sie Namen des Kreditkarten Inhabers an',
            'errorCardNumber' => 'Bitte geben sie die Nummer der Kreditkarte an',
            'errorCvvNumber' => 'Bitte geben sie die CVV/CVC Nummer an',
            'errorCouldntConnectToServer' => 'Es konnte keine Verbindung zum Server des Zahlungsanbieters hergestellt werden.',
            'errNoAccessKey' => 'Bitte geben Sie den AccessKey an.',
            'errNoProject' => 'Bitte geben Sie das Projektkürzel an.',
            'auftrag' => 'Auftrag'
        ),
        'en_UK' => array(
            'displayName' => 'Micropayment Creditcard',
            'testMode' => 'test mode',
            'accessKey' => 'access key',
            'project' => 'project short',
            'server' => 'Server',
            'deutschland' => 'Germany',
            'schweiz' => 'Switzerland',
            'ownerName' => 'Creditcard owner',
            'cardNumber' => 'Creditcard number',
            'expirationDateMonth' => 'valid until (month)',
            'expirationDateYear' => 'valid until (year)',
            'january' => 'January',
            'february' => 'February',
            'march' => 'March',
            'april' => 'April',
            'may' => 'May',
            'june' => 'June',
            'july' => 'July',
            'august' => 'August',
            'september' => 'September',
            'oktober' => 'Oktober',
            'november' => 'November',
            'december' => 'December',
            'cvvNumber' => 'CVV / CVC',
            'errorOwnerName' => 'Please enter the name of the credit card owner',
            'errorCardNumber' => 'Please enter the number of the credit card',
            'errorCvvNumber' => 'Please enter the CVV/CVC number',
            'errorCouldntConnectToServer' => 'The connection to the server of the payment provider failed.',
            'auftrag' => 'order'
        )
    );
    private $localeStrings;
    private $locale;

    // Config Parameters
    private $testMode;
    private $accessKey;
    private $project;
    private $webserviceURL;

    // Input Parameters
    private $ownerName;
    private $cardNumber;
    private $expirationDateMonth;
    private $expirationDateYear;
    private $cvvNumber;

    // status of the payment sequence
    private $paymentStep = 'init';

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

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

    public function setLocale($locale)
    {
        $this->locale = $locale;
        if(isset($this->strings[$locale])) {
            $this->localeStrings = $this->strings[$locale];
        } else {
            $this->localeStrings = $this->strings['en_UK'];
        }
    }

    public function getDisplayName()
    {
        return $this->localeStrings['displayName'];
    }

    public function getConfigParams()
    {
        return array(
            new ParamCfg('testMode', $this->localeStrings['testMode'], ParamCfg::TYPE_CHECK),
            new ParamCfg('accessKey', $this->localeStrings['accessKey'], ParamCfg::TYPE_STRING),
            new ParamCfg('project', $this->localeStrings['project'], ParamCfg::TYPE_STRING),
            new ParamCfg('server', $this->localeStrings['server'], ParamCfg::TYPE_SELECT, array('de' => $this->localeStrings['deutschland'], 'ch' => $this->localeStrings['schweiz']))
        );
    }

    public function setConfig($arrConfig)
    {
        $this->testMode = $arrConfig['testMode']?1:0;
        $this->accessKey = $arrConfig['accessKey'];
        $this->project = $arrConfig['project'];
        if($arrConfig['server'] == 'de') {
            $this->webserviceURL = self::WEBSERVICE_URL_DE;
        } else {
            $this->webserviceURL = self::WEBSERVICE_URL_CH;
        }

    }

    public function validateConfig($arrConfig)
    {
        if(trim($arrConfig['accessKey']) == '' && trim($arrConfig['project']) == '') {
            return true;
        }

        if(trim($arrConfig['accessKey']) == '') {
            $errors['accessKey'] = $this->localeStrings['errNoAccessKey'];
        }
        if(trim($arrConfig['project']) == '') {
            $errors['project'] = $this->localeStrings['errNoProject'];
        }
        if($errors) {
            return $errors;
        } else {
            return true;
        }
    }

    public function getPaymentChoiceTemplate()
    {
        return array();
    }

    public function validateAndSetPaymentChoice($arrParams)
    {
        return true;
    }

    /**
     *
     * @param $cart
     * @param $customer
     * @param $requestParams
     * @return \PaymentResult
     */
    public function doPayment(OrderData $order, array $requestParams)
    {
        switch($this->paymentStep)
        {
            case 'init':
                $params = array(
                    'project' => $this->project,
                    'title' => 'Auftrag ' . $order->orderNumber,
                    'amount' => $order->totalAmount * 100,
                    'currency' => $order->currency->ISOCode,
                    'userid' => $order->customer->customerID,
                    'theme' => 'l2',
                    'bgcolor' => '',
                    'session' => $_SESSION['sessionId'],
                    'mp_user_email' => $order->customer->email,
                    'mp_user_firstname' => $order->customer->invoiceAddress->firstName,
                    'mp_user_surname' => $order->customer->invoiceAddress->lastName,
                    'mp_user_address' => $order->customer->invoiceAddress->street . ' ' . $order->customer->invoiceAddress->houseNumber,
                    'mp_user_zip' => $order->customer->invoiceAddress->zipCode,
                    'mp_user_city' => $order->customer->invoiceAddress->city,
                    'mp_user_country' => $order->customer->invoiceAddress->country->isocode
                );

                $paramstring = '';
                foreach($params as $key => $value) {
                    $paramstring .= $key . '=' . $value . '&';
                }
                $params['seal'] = md5($paramstring . $this->accessKey);
                $this->paymentStep = 'paymentSent';
                return new PaymentResult(PaymentResult::IFRAME_REQUIRED, $this->webserviceURL, $params);
            case 'paymentSent':
                if($requestParams['function'] == 'billing' && $requestParams['session'] == $_SESSION['sessionId']) {
                    return new PaymentResult(PaymentResult::PAYMENT_COMPLETE);
                } else {
                    return new PaymentResult(PaymentResult::PAYMENT_FAILED);
                }
                break;
        }
    }
}
