"""Local receiver. Use a managed HTTPS server for deployment."""
import os
from http.server import BaseHTTPRequestHandler, HTTPServer
from merchant import open_store, verify, accept_webhook

SECRET = os.environ['TRADEON_WEBHOOK_SECRET']
DB = open_store()


class Handler(BaseHTTPRequestHandler):
    def do_POST(self):
        if self.path != '/webhooks/tradeon':
            self.send_error(404)
            return
        try:
            length = int(self.headers.get('Content-Length', '-1'))
            if not 0 <= length <= 1024 * 1024:
                self.send_error(413)
                return
            raw = self.rfile.read(length)
            headers = {key.lower(): value for key, value in self.headers.items()}
            verify(raw, headers, SECRET)
        except (ValueError, KeyError, TypeError):
            self.send_error(400)
            return
        try:
            status = accept_webhook(DB, raw, headers, SECRET)
        except Exception:
            self.send_error(503)
            return
        self.send_response(status)
        self.end_headers()


if __name__ == '__main__':
    print('Listening on http://127.0.0.1:8080/webhooks/tradeon')
    HTTPServer(('127.0.0.1', 8080), Handler).serve_forever()
