"""Learning demo: a JSON visit counter with persistent SQLite storage."""

import json
import logging
import os
import sqlite3
from contextlib import closing
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer

DATABASE = os.environ.get("DATABASE_PATH", "/data/visits.sqlite3")
MESSAGE = os.environ.get("APP_MESSAGE", "Hello from Compose")


class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path not in ("/", "/healthz"):
            self.send_json(404, {"error": "not found"})
            return
        try:
            with closing(sqlite3.connect(DATABASE, timeout=5)) as db:
                if self.path == "/healthz":
                    db.execute("SELECT visits FROM counter WHERE id = 1").fetchone()
                    payload = {"status": "ok"}
                else:
                    db.execute("UPDATE counter SET visits = visits + 1 WHERE id = 1")
                    visits = db.execute("SELECT visits FROM counter WHERE id = 1").fetchone()[0]
                    payload = {"message": MESSAGE, "visits": visits}
                db.commit()
            self.send_json(200, payload)
        except sqlite3.Error:
            logging.exception("database operation failed")
            self.send_json(503, {"error": "database unavailable"})

    def send_json(self, status, payload):
        body = (json.dumps(payload, ensure_ascii=False) + "\n").encode("utf-8")
        self.send_response(status)
        self.send_header("Content-Type", "application/json; charset=utf-8")
        self.send_header("Content-Length", str(len(body)))
        self.send_header("Cache-Control", "no-store")
        self.end_headers()
        self.wfile.write(body)


if __name__ == "__main__":
    with closing(sqlite3.connect(DATABASE)) as db:
        db.execute("CREATE TABLE IF NOT EXISTS counter (id INTEGER PRIMARY KEY, visits INTEGER NOT NULL)")
        db.execute("INSERT OR IGNORE INTO counter VALUES (1, 0)")
        db.commit()
    ThreadingHTTPServer(("0.0.0.0", int(os.environ.get("PORT", "8000"))), Handler).serve_forever()
