<?php

/**
 *  Informatica Eindproject D4p
 *  6in3, Stedelijk Gymnasium Nijmegen
 *  Docent: Hans de Wolf
 *
 *  ==================
 *
 *  Daniel Boutros,
 *  Christiaan Goossens,
 *  Jelmer Hinssen
 */

namespace Inforbank\Application;

use \Slim\App;
use Inforbank\Application\Auth\Middleware;
use Inforbank\Application\Helper\Header;
use Inforbank\Application\Helper\Idob\Transactie;
use Inforbank\Application\Helper\Idob\Client;
use Inforbank\Application\Helper\Rekeningen as RekeningHelper;
use Inforbank\Application\Helper\Berichten as BerichtenHelper;
use Inforbank\Application\Helper\Overboekingen;
use Inforbank\Application\Helper\Redirect;
use Inforbank\Application\Helper\IBAN;

class Idob
{
    public function __construct(App $app)
    {
        /**
         * Create the API route group
         */
        $app->group('/idob', function () {
            $this->get('/betalen', function ($request, $response, $args) {
                $query = $request->getQueryParams();
                $rekeningen = RekeningHelper::getCurrentUserRekeningen();

                try {
                    $transactie = Transactie::getTransactie($query['trxid']);
                    $client = new Client($transactie['clientId']);
                    $naam = $client->getClientName();
                } catch (\Exception $e) {
                    $transactie = false;
                }

                return $this->renderer->render($response, 'idob.phtml', [
                    'header' => Header::getHeaderData(),
                    'transactie' => $transactie,
                    'webwinkel' => $naam,
                    'rekeningen' => $rekeningen
                ]);
            });

            $this->get('/mislukt', function ($request, $response, $args) {
                return $this->renderer->render($response, 'idobmislukt.phtml', [
                    'header' => Header::getHeaderData()
                ]);
            });

            $this->post('/betalen', function ($request, $response, $args) {
                $query = $request->getQueryParams();
                $post = $request->getParsedBody();
                $van = $post['van'];

                try {
                    $transactie = Transactie::getTransactie($query['trxid']);
                    $client = new Client($transactie['clientId']);
                    $redirectUri = $client->getClientRedirectURI();
                    $rekening = $client->getClientRekening();
                    $naam = $client->getClientName();

                    try {
                        /**
                         * All set to pay!
                         */
                         $ibanhelper = new IBAN();

                        // Do overboeking
                        Overboekingen::createOverboeking($ibanhelper->getIBAN($van), $ibanhelper->getIBAN($rekening), $transactie['amount'], "Betaling aan " . $naam . " voor transactie " . $transactie['reference'], "id");

                        // Do Status update
                        Transactie::setTransactionStatus($transactie['transactieId'], 2);

                        // Do bericht
                        BerichtenHelper::newBericht($this->auth->getUserID(), $naam, "Betaling met transactiereferentie " . $transactie['reference'] . " gelukt.");

                        $response = $response->withStatus(302);
                        $response = $response->withHeader('Location', $redirectUri . "?trxid=".$transactie['transactieId']);
                        return $response;
                    } catch (\Exception $e) {
                        $response = $response->withStatus(302);
                        $response = $response->withHeader('Location', $redirectUri . "?error=".$e->getMessage());
                        return $response;
                    }
                } catch (\Exception $e) {
                    return Redirect::create($request, $response, "/idob/mislukt");
                }
            });
        })->add(new Middleware());
    }
}
