"""
HTTP-сервер для статических файлов игры и сохранения результатов.
Использует только стандартную библиотеку Python (http.server).
"""
import json
import logging
import threading
from http.server import HTTPServer, SimpleHTTPRequestHandler
from pathlib import Path

from config import SERVER_PORT
from db import save_score_sync, init_db_sync

logger = logging.getLogger(__name__)

GAME_DIR = Path(__file__).parent


class CORSHandler(SimpleHTTPRequestHandler):
    """SimpleHTTPRequestHandler с CORS-заголовками, раздачей файлов и API."""

    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=str(GAME_DIR), **kwargs)

    def do_OPTIONS(self):
        """Обработка CORS preflight запросов."""
        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 do_POST(self):
        """Обработка POST запросов для сохранения очков."""
        if self.path.startswith("/api/save_score"):
            try:
                content_length = int(self.headers.get("Content-Length", 0))
                post_body = self.rfile.read(content_length).decode("utf-8")
                data = json.loads(post_body)

                user_id = int(data.get("user_id"))
                username = str(data.get("username", "") or "")
                first_name = str(data.get("first_name", "") or "")
                score = int(data.get("score", 0))

                save_score_sync(user_id, username, first_name, score)
                logger.info(
                    "Сохранен рекорд игрока user_id=%s (@%s, %s): %s очков",
                    user_id, username, first_name, score
                )

                response_bytes = json.dumps({"ok": True, "saved": True}).encode("utf-8")
                self.send_response(200)
                self.send_header("Content-Type", "application/json; charset=utf-8")
                self.send_header("Content-Length", str(len(response_bytes)))
                self.end_headers()
                self.wfile.write(response_bytes)
            except Exception as e:
                logger.error("Ошибка при сохранении очков: %s", e)
                err_bytes = json.dumps({"ok": False, "error": str(e)}).encode("utf-8")
                self.send_response(400)
                self.send_header("Content-Type", "application/json; charset=utf-8")
                self.send_header("Content-Length", str(len(err_bytes)))
                self.end_headers()
                self.wfile.write(err_bytes)
        else:
            self.send_error(404, "Not Found")

    def end_headers(self):
        # Разрешаем запросы с любого источника (нужно для Telegram WebApp)
        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.send_header("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0")
        self.send_header("Pragma", "no-cache")
        self.send_header("Expires", "0")
        super().end_headers()

    def log_message(self, fmt, *args):
        # Перенаправляем в Python-логгер
        logger.info(fmt, *args)


def _run_http_server():
    """Запускает HTTP-сервер в отдельном потоке (для работы за Nginx)."""
    init_db_sync()
    httpd = HTTPServer(("0.0.0.0", SERVER_PORT), CORSHandler)
    logger.info("Статический сервер запущен на порту %s: http://127.0.0.1:%s/game/index.html", SERVER_PORT, SERVER_PORT)
    httpd.serve_forever()


def run_server():
    """Запускает HTTP-сервер в фоновом потоке."""
    thread = threading.Thread(target=_run_http_server, daemon=True)
    thread.start()
    logger.info("Сервер запущен в фоновом потоке")
    return thread


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    print(f"Сервер: http://localhost:{SERVER_PORT}/game/index.html")
    _run_http_server()
