#!/usr/bin/python3

from decimal import Decimal
import os
import sys
import urllib.parse

sys.path.insert(0, "/usr/local/mgr5/lib/python")
from billmgr.exception import XmlException, log_backtrace
import billmgr.logger as logging
from billmgr.modules.paymentcgi import PageType, PaymentCgi, PaymentCgiType, run_cgi
from billmgr import payment

from revolut.api import RevolutApi, WebhookEvent


logging.init_logging('revolutpayment')
logger = logging.get_logger('revolutpayment')


class RevolutPaymentCgi(PaymentCgi):
    def __init__(self):
        super().__init__()

    def cgi_type(self) -> PaymentCgiType:
        return PaymentCgiType.Payment

    def process(self):
        api = RevolutApi(
            use_sandbox=self.paymethod_params['test'] == 'on',
            secret_api_key=self.paymethod_params['secret_key']
        )

        try:
            if self.payment_params.get('externalid', ''):
                response = api.retrieve_order(self.payment_params['externalid'])
                if response.checkout_url:
                    self.redirect_to_url(response.checkout_url)
                else:
                    self.redirect_to_url(self.get_page(PageType.Pending))
                return

            response = api.create_order(RevolutApi.CreateOrderRequest(
                amount=Decimal(self.payment_params['paymethodamount']),
                currency=self.currency_params['iso'],
                redirect_url=self.get_page(PageType.Pending),
                reference=self.elid()
            ))
            payment.set_in_pay(int(self.elid()), response.id)
            self.redirect_to_url(response.checkout_url)

        except XmlException:
            self.redirect_to_url(self.get_page(PageType.Fail))

        except:
            log_backtrace()
            self.redirect_to_url(self.get_page(PageType.Fail))


if __name__ == '__main__':
    run_cgi(RevolutPaymentCgi)
