#!/usr/bin/python3

import sys

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.db as db
import billmgr.payment as payment

import paypal.api as paypal_api


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

PAYMETHOD_MODULE_NAME = "pmpaypalcheckout"

class PayPalResultCgi(PaymentCgi):
    def __init__(self):
        self._payment_id = 0
        PaymentCgi.__init__(self)

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

    def _find_payment(self, external_id: str) -> int:
        return db.get_first_record_unwrap(
            ' SELECT id FROM payment'\
            f' WHERE paymethod IN (SELECT id FROM paymethod WHERE module = "{PAYMETHOD_MODULE_NAME}")'\
            f' AND externalid = "{external_id}"'
        ).as_int('id')

    def parse_input(self):
        self._payment_id = self._find_payment(self.input["order_id"])

    def elid(self) -> str:
        return str(self._payment_id)

    def process(self):
        paypal_order_id = self.input["order_id"]

        try:
            auth = paypal_api.authenticate(paypal_api.AuthData(
                self.paymethod_params["client_id"],
                self.paymethod_params["secret"],
                self.paymethod_params["test"] == "on"
            ))
            response = paypal_api.request_capture_order(auth, paypal_order_id)
            captured_order = paypal_api.parse_capture_order(response)

            external_id = f'{captured_order.order_id}/{captured_order.capture_id}'

            if captured_order.is_pending:
                payment.set_in_pay(int(self.elid()), external_id)
                self.redirect_to_url(self.get_page(PageType.Pending))

            else:
                if captured_order.stored_token is None:
                    payment.set_paid(int(self.elid()), external_id)
                else:
                    payment.set_paid(int(self.elid()), external_id, payment.RecurringInfo(
                        status=payment.RecurringStatus.rsStored,
                        token=captured_order.stored_token,
                        data1='',
                        data2='',
                        name=''
                    ))

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


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

