#!/usr/bin/env python3
import json
import os
import sqlite3
import sys
from typing import Any, Dict, Optional

DB_DIR = "/data/error-reports"
DB_PATH = os.path.join(DB_DIR, "error_db.sqlite3")


def ensure_schema(cur: sqlite3.Cursor) -> None:
    cur.execute(
        """
        CREATE TABLE IF NOT EXISTS tbl_claim (
            claim_Id INTEGER PRIMARY KEY AUTOINCREMENT,
            station_id INTEGER NOT NULL,
            claim_description TEXT NOT NULL,
            user_email TEXT,
            state INTEGER NOT NULL DEFAULT 0,
            observation TEXT
        )
        """
    )

    cur.execute("PRAGMA table_info(tbl_claim)")
    columns = {row[1] for row in cur.fetchall()}

    if "state" not in columns:
        cur.execute("ALTER TABLE tbl_claim ADD COLUMN state INTEGER NOT NULL DEFAULT 0")

    if "observation" not in columns:
        cur.execute("ALTER TABLE tbl_claim ADD COLUMN observation TEXT")


def insert_claim(station_id: int, description: str, user_email: Optional[str]) -> int:
    os.makedirs(DB_DIR, mode=0o750, exist_ok=True)
    conn = sqlite3.connect(DB_PATH, timeout=5)
    try:
        cur = conn.cursor()
        ensure_schema(cur)
        cur.execute(
            """
            INSERT INTO tbl_claim (station_id, claim_description, user_email, state, observation)
            VALUES (?, ?, ?, 0, NULL)
            """,
            (station_id, description, user_email),
        )
        conn.commit()
        return int(cur.lastrowid)
    finally:
        conn.close()


def main() -> int:
    try:
        payload: Dict[str, Any] = json.load(sys.stdin)
        station_id = int(payload["station_id"])
        description = str(payload["description"])
        user_email = payload.get("email")
        if user_email is not None:
            user_email = str(user_email)

        claim_id = insert_claim(station_id, description, user_email)
        sys.stdout.write(json.dumps({"ok": True, "claim_id": claim_id}))
        return 0
    except Exception as exc:
        sys.stdout.write(json.dumps({"ok": False, "error": str(exc)}))
        return 1


if __name__ == "__main__":
    raise SystemExit(main())
