#!/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.logger as logging
import billmgr.db as db
import billmgr.payment as payment


import paypalexpanded.api as paypal_api

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

PAYMETHOD_MODULE_NAME = "pmpaypalexpanded"

class PayPalResultCgi(paypal_api.PayPalBaseCgi):
    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 WHERE paymethod IN (SELECT id FROM paymethod WHERE module = %s) AND externalid = %s",
            PAYMETHOD_MODULE_NAME,
            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 = self.authenticate()
            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}'
            payment.set_in_pay(int(self.elid()), external_id)

            if captured_order.is_pending:
                self.redirect_to_url(self.get_page(PageType.Pending))
            else:
                self.redirect_to_url(self.get_page(PageType.Success))
        except Exception as e:
            logger.error(f"Payment failed: {e}")
            self.redirect_to_url(self.get_page(PageType.Fail))  

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

