import json
import os
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path


class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path != '/':
            self.respond(404, {'error': 'not_found'})
            return
        try:
            stock = json.loads(Path('/config/stock.json').read_text())
            if not isinstance(stock, dict) or not stock:
                raise ValueError('invalid stock')
            if not all(isinstance(k, str) and type(v) is int and v >= 0
                       for k, v in stock.items()):
                raise ValueError('invalid quantity')
            self.respond(200, {'version': os.environ['APP_VERSION'],
                               'items': len(stock), 'quantity': sum(stock.values())})
        except (OSError, ValueError):
            self.respond(503, {'error': 'stock_unavailable'})

    def respond(self, status, data):
        payload = (json.dumps(data, sort_keys=True) + '\n').encode()
        self.send_response(status)
        self.send_header('Content-Type', 'application/json')
        self.send_header('Content-Length', str(len(payload)))
        self.end_headers()
        self.wfile.write(payload)

    def log_message(self, format, *args):
        print('http', args[1], flush=True)


if __name__ == '__main__':
    ThreadingHTTPServer(('0.0.0.0', 8080), Handler).serve_forever()
