#!/usr/bin/python3

from decimal import ROUND_CEILING, Decimal
import sys
from string import Template

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

import paypal.api as paypal_api

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


ACTION_ORDER = 'order'

PAYMENT_FORM_FILE = 'etc/paymethods/paypal_checkout.html'

MIN_AMOUNT = '0.01'
MIN_AMOUNT_CURRENCY = 'USD'

class PayPalPaymentCgi(PaymentCgi):
    def __init__(self):
        PaymentCgi.__init__(self)

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

    def process(self):
        logger.info(f'payment_params = {self.payment_params}')
        logger.info(f'paymethod_params = {self.paymethod_params}')
        logger.info(f'success page = {self.get_page(PageType.Success)}')
        logger.info(f'fail page = {self.get_page(PageType.Fail)}')

        amount = Decimal(self.payment_params["paymethodamount"]).quantize(Decimal('0.01'), ROUND_CEILING)

        if "action" not in self.input:
            client_id = self.paymethod_params["client_id"]
            currency_iso = self.currency_params["iso"]
            with open(PAYMENT_FORM_FILE, 'r') as f:
                form = Template(f.read())
                form = form.substitute(
                    main_cgi = '/mancgi/ppcheckoutpayment',
                    result_cgi = '/mancgi/ppcheckoutresult',
                    amount = str(amount),
                    sdk_url = paypal_api.js_paypal_sdk_url(client_id, currency_iso)
                )
                sys.stdout.write(form)

        elif self.input["action"] == ACTION_ORDER:
            auth = paypal_api.authenticate(paypal_api.AuthData(
                self.paymethod_params["client_id"],
                self.paymethod_params["secret"],
                self.paymethod_params["test"] == "on"
            ))

            need_save = False
            if "store_payment" in self.payment_params and self.payment_params["store_payment"] == "on":
                logger.info("need_save = True")
                need_save = True

            response = paypal_api.request_create_order(
                auth,
                paypal_api.Order(
                    amount=amount,
                    currency_iso=self.currency_params["iso"],
                    reference_id=self.elid(),
                    need_save=need_save,
                    urls=paypal_api.Urls(
                        return_url=self.get_page(PageType.Success),
                        cancel_url=self.get_page(PageType.Fail),
                    )
                )
            )

            payment.set_in_pay(int(self.elid()), response.json()["id"], response.text)
            logger.info(f"paypal create_order response: {response.text}")
            sys.stdout.write(response.text)

    def content_type(self):
        if self.input.get("action") == ACTION_ORDER:
            return "application/json"
        else:
            return PaymentCgi.content_type(self)


if __name__ == "__main__":
    run_cgi(PayPalPaymentCgi)
