#!/usr/bin/python3

import sys

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

import paypalexpanded.api as paypal_api

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

MAIN_CGI = "/mancgi/ppexpandedrecurring"
RESULT_CGI = "/mancgi/ppexpandedrecurringresult"

class PayPalRecurringCgi(paypal_api.PayPalBaseCgi):
    def cgi_type(self) -> PaymentCgiType:
        return PaymentCgiType.NewRecurring

    def process(self):
        logger.debug(f"Creating recurring setup: {self.recurring_params}")

        payment_method = self.recurring_params["payment_method"]
        funding = self.get_recuring_funding_source()
        if not payment_method:
            payment_method = paypal_api.DEFAULT_PAYMENT_METHOD
            funding = paypal_api.DEFAULT_PAYMENT_METHOD

        auth = self.authenticate()

        response = paypal_api.request_create_order(
            auth=auth,
            order=paypal_api.Order(
                amount=paypal_api.MIN_AMOUNT,
                currency_iso=self.get_currency_iso(),
                reference_id=f"r{self.elid()}",
                need_save=True,
                urls=paypal_api.Urls(
                    return_url=self.get_page(PageType.Success),
                    cancel_url=self.get_page(PageType.Fail),
                )
            ),
            paymethod=payment_method,
        )

        status = payment.RecurringStatus.rsStoring if self.is_stored_paymethod(
            payment.RecurringStatus(int(self.recurring_params['status']))
        ) else payment.RecurringStatus.rsAdd

        payment.save_recurring_info(int(self.elid()), payment.RecurringInfo(
            status=status,
            token='',
            data1=response.json()["id"],
            data2=payment_method,
            name='',
        ))

        logger.info(f"Recurring order created: {response.json()['id']}")
        self.render_payment_form(response.text, paypal_api.MIN_AMOUNT, funding, MAIN_CGI, RESULT_CGI)

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

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