"""WebSMS Connexus webhook receiver - handles MO (replies) + DLR (delivery reports).

Flask app. Configure the URL in Members Area -> API Keys.

    pip install flask
    python webhook.py    # listens on :3000

Always responds 200 within 5s; failed webhooks are retried up to 3 times.
"""

import logging
import os

from flask import Flask, jsonify, request

app = Flask(__name__)
log = logging.getLogger('websms-webhook')
logging.basicConfig(level=logging.INFO)


@app.post('/webhook')
def webhook():
    data = request.get_json(silent=True) or {}
    kind = data.get('type')

    if kind == 'mo':
        # Incoming SMS reply
        log.info('mo: %s -> %s', data.get('from'), data.get('body'))
        # TODO: persist + dispatch to your business logic

    elif kind == 'dlr':
        # Delivery report
        # statusCode 1=DELIVRD, 2=UNDELIV, 4=QUEUED/expired, 8=ACCEPTD, 16=UNDELIV/rejected
        log.info('dlr: %s status=%s code=%s',
                 data.get('messageId'), data.get('status'), data.get('statusCode'))
        # TODO: update the status of the original send

    else:
        log.warning('unknown webhook type: %s', kind)

    return jsonify(ok=True)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 3000)))
