#!/usr/bin/env python3
"""Chronicle server — serves static files + DELETE endpoint for post removal.

POST /api/delete  {row_index: N}  → removes row N from CSV, returns updated count
GET  /*                           → serves static files from cwd
"""

import http.server
import json
import csv
import os
import sys
from urllib.parse import urlparse

PORT = 8928
CSV_FILE = "protest_posts_master.csv"


class ChronicleHandler(http.server.SimpleHTTPRequestHandler):

    def do_POST(self):
        path = urlparse(self.path).path

        if path == "/api/delete":
            self._handle_delete()
        else:
            self.send_error(404)

    def _handle_delete(self):
        try:
            length = int(self.headers.get("Content-Length", 0))
            body = json.loads(self.rfile.read(length)) if length else {}

            fingerprint = body.get("fingerprint")
            row_index = body.get("row_index")

            with open(CSV_FILE, newline="") as f:
                reader = csv.DictReader(f)
                fields = reader.fieldnames
                rows = list(reader)

            removed = None
            remove_idx = None

            if fingerprint:
                # Match by fingerprint (handle + text prefix)
                import base64
                for i, row in enumerate(rows):
                    key = (row.get("handle", "") + "|" + (row.get("text", "") or "")[:80])[:120]
                    fp = base64.b64encode(key.encode("utf-8")).decode("ascii")
                    fp = "".join(c for c in fp if c.isalnum())
                    if fp == fingerprint:
                        remove_idx = i
                        break
            elif row_index is not None:
                remove_idx = int(row_index)

            if remove_idx is None or remove_idx < 0 or remove_idx >= len(rows):
                self._json_response(400, {"error": "Post not found"})
                return

            removed = rows.pop(remove_idx)

            with open(CSV_FILE, "w", newline="") as f:
                writer = csv.DictWriter(f, fieldnames=fields)
                writer.writeheader()
                writer.writerows(rows)

            handle = removed.get("handle", "?")
            text_preview = removed.get("text", "")[:60]
            print(f"[delete] Removed row {remove_idx}: @{handle} — {text_preview}...")

            self._json_response(200, {
                "ok": True,
                "removed": {"handle": handle, "text": text_preview},
                "remaining": len(rows),
            })

        except Exception as e:
            self._json_response(500, {"error": str(e)})

    def _json_response(self, code, data):
        body = json.dumps(data).encode()
        self.send_response(code)
        self.send_header("Content-Type", "application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Content-Length", len(body))
        self.end_headers()
        self.wfile.write(body)

    def do_OPTIONS(self):
        self.send_response(200)
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
        self.send_header("Access-Control-Allow-Headers", "Content-Type")
        self.end_headers()

    def log_message(self, fmt, *args):
        if "/api/" in str(args[0]) if args else False:
            sys.stderr.write(f"[chronicle] {args[0]}\n")


if __name__ == "__main__":
    os.chdir(os.path.dirname(os.path.abspath(__file__)))
    server = http.server.HTTPServer(("0.0.0.0", PORT), ChronicleHandler)
    print(f"Chronicle server on http://localhost:{PORT}")
    print(f"  Static files: {os.getcwd()}")
    print(f"  CSV: {CSV_FILE}")
    print(f"  DELETE endpoint: POST /api/delete {{row_index: N}}")
    server.serve_forever()
