#!/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
from billmgr.exception import XmlException
import billmgr.payment as payment

import paypal.api as paypal_api


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

PAYMETHOD_MODULE_NAME = "pmpaypalcheckout"

class PayPalRecurringResultCgi(PaymentCgi):
    def __init__(self):
        self._recurring_id = 0
        PaymentCgi.__init__(self)

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

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

    def parse_input(self):
        self._recurring_id = self._find_recurring(self.input["order_id"])

    def elid(self) -> str:
        return str(self._recurring_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)

            if captured_order.is_pending:
                external_id = f'{captured_order.order_id}/{captured_order.capture_id}'
                if self.is_stored_paymethod(payment.RecurringStatus(int(self.recurring_params['status']))):
                    status = payment.RecurringStatus.rsStoring
                else:
                    status = payment.RecurringStatus.rsAdd

                payment.save_recurring_info(int(self.elid()), payment.RecurringInfo(
                    status=status,
                    token='',
                    data1=external_id,
                    data2='',
                    name=''
                ))

            else:
                if captured_order.stored_token is None:
                    raise paypal_api.TokenNotFoundError()

                if self.is_stored_paymethod(payment.RecurringStatus(int(self.recurring_params['status']))):
                    status = payment.RecurringStatus.rsStored
                else:
                    status = payment.RecurringStatus.rsActive

                payment.save_recurring_info(int(self.elid()), payment.RecurringInfo(
                    status=status,
                    token=captured_order.stored_token,
                    data1='',
                    data2='',
                    name=''
                ))

                # Возвращаем минимальный платеж, созданный для создания для привязки
                paypal_api.request_refund_full_captured_order(auth, capture_id=captured_order.capture_id)

                redirect_page = self.get_page(PageType.Success)
                logger.info(f'redirect_page = {redirect_page}')

                self.redirect_to_url(redirect_page)

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


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

