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


MODULE = "payssionresult"
logging.init_logging(MODULE)
logger = logging.get_logger(MODULE)

PAYMETHOD_MODULE_NAME = "pmpayssion"


class PayssionResultCgi(PaymentCgi):

    def need_auth(self):
        return False

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

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

    def _find_payment(self) -> db.Record:
        return db.get_first_record_unwrap(
            f" SELECT pay.externalid, pm.xmlparams FROM payment AS pay"
            f" JOIN paymethod AS pm ON pay.paymethod = pm.id"
            f" WHERE pm.module = '{PAYMETHOD_MODULE_NAME}'"
            f" AND pay.id = \"{self.elid()}\""
        )

    def parse_input(self):
        self._elid: str = self.input["elid"]

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

    def process(self):
        logger.info("run payssionresult")

        try:
            status = int(self.payment_params["status"])
            logger.info(f"status is {type(status)}")
            logger.info(f"status is {PaymentMgrStatus(status).name}")

            if status == PaymentMgrStatus.psPaid.value:
                logger.info("paid")
                self.redirect_to_url(self.get_page(PageType.Success))

            elif status in {PaymentMgrStatus.psInPay.value,
                            PaymentMgrStatus.psNewMomental.value,
                            PaymentMgrStatus.psNew.value
                            }:
                logger.info("in_pay")
                self.redirect_to_url(self.get_page(PageType.Pending))

            elif status in {PaymentMgrStatus.psFraud.value, 
                            PaymentMgrStatus.psCanceled.value}:
                logger.info("canceled")
                self.redirect_to_url(self.get_page(PageType.Fail))

        except Exception as error:
            billmgr.exception.log_backtrace()
            self.redirect_to_url(self.get_page(PageType.Fail))


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