#!/usr/bin/python3

from decimal import ROUND_CEILING, Decimal
import sys

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

import paypalexpanded.api as paypal_api

logging.init_logging('ppexpandedpayment')
logger = logging.get_logger('ppexpandedpayment')
MAIN_CGI = "/mancgi/ppexpandedpayment"
RESULT_CGI = "/mancgi/ppexpandedredirect"

class PayPalPaymentCgi(paypal_api.PayPalBaseCgi):
    def cgi_type(self) -> PaymentCgiType:
        return PaymentCgiType.Payment

    def process(self):
        logger.debug(f"Processing payment: {self.payment_params}")

        amount = Decimal(self.payment_params["paymethodamount"]) \
            .quantize(paypal_api.MIN_AMOUNT, ROUND_CEILING)

        auth = self.authenticate()
        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

        funding = self.get_funding_source()

        response = paypal_api.request_create_order(
            auth=auth,
            order=paypal_api.Order(
                amount=amount,
                currency_iso=self.get_currency_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),
                )
            ),
            paymethod=self.payment_params["payment_method"],
        )

        order_id = response.json()["id"]
        payment.set_in_pay(int(self.elid()), order_id, response.text)

        logger.info(f"Created PayPal order: {order_id}")
        self.render_payment_form(response.text, amount, funding, MAIN_CGI, RESULT_CGI)

    def content_type(self):
        return "text/html"

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

