#!/usr/bin/env python3
"""SnapEX Pay payment module for BILLmanager 6: paymethods/pmsnapexpay --command <config|pmvalidate|checkpay>."""

import argparse
import os
import sys
import xml.etree.ElementTree as ET

sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "lib", "python"))

import snapexpay  # noqa: E402
from snapexpay import gateway  # noqa: E402

CONFIG = """<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <feature>
    <redirect>on</redirect>
    <notneedprofile>on</notneedprofile>
    <pmvalidate>on</pmvalidate>
    <checkpay>on</checkpay>
  </feature>
  <param>
    <payment_script>/mancgi/snapexpaypayment</payment_script>
  </param>
</doc>
"""


def errors_xml(errors):
    doc = ET.Element("doc")
    for field, problem in errors:
        err = ET.SubElement(doc, "error", type="value", object=field)
        ET.SubElement(err, "param", name="object", type="msg", msg=field).text = field
        if field != "api_key":  # never echo the key
            ET.SubElement(err, "param", name="value").text = problem
    return ET.tostring(doc, encoding="unicode")


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--command", default="")
    parser.add_argument("--payment", default="")
    parser.add_argument("--amount", default="")
    args, _ = parser.parse_known_args()
    log = snapexpay.logger()

    if args.command == "config":
        sys.stdout.write(CONFIG)
    elif args.command == "pmvalidate":
        raw = sys.stdin.read()
        form = ET.fromstring(raw) if raw.strip() else ET.Element("doc")
        errors = gateway.validate(form)
        sys.stdout.write(errors_xml(errors) if errors else (raw if raw.strip() else "<doc/>"))
    elif args.command == "checkpay":
        checked = gateway.checkpay()
        if checked:
            log.info("checkpay: %d invoice(s) checked", checked)
        sys.stdout.write("<doc/>")
    else:
        log.info("command %r is not used by this module", args.command)
        sys.stdout.write("<doc/>")
    return 0


if __name__ == "__main__":
    try:
        sys.exit(main())
    except Exception as exc:
        snapexpay.logger().exception("pmsnapexpay %s: %s", " ".join(sys.argv[1:]), exc)
        sys.stdout.write('<doc><error type="xml"/></doc>')
        sys.exit(1)
