"""
Simple script to test MongoDB connection using the same config style as the backend.

Ưu tiên lấy `MONGODB_URI` từ:
- Biến môi trường / file `.env` (đúng chuẩn backend đang dùng)
- Fallback: file `env.txt` trong thư mục `backend` (đang có sẵn của bạn)
"""

from __future__ import annotations

import asyncio
import os
from typing import Optional

from motor.motor_asyncio import AsyncIOMotorClient
from dotenv import load_dotenv


BASE_DIR = os.path.dirname(__file__)
ENV_TXT_PATH = os.path.join(BASE_DIR, "env.txt")
DOTENV_PATH = os.path.join(BASE_DIR, ".env")


def load_env_from_env_txt() -> None:
    """
    Load các biến môi trường từ file `env.txt` (KEY=VALUE per line).

    Chỉ set nếu biến đó chưa có trong `os.environ`,
    để ưu tiên biến môi trường / file `.env` nếu có.
    """
    if not os.path.exists(ENV_TXT_PATH):
        return

    with open(ENV_TXT_PATH, encoding="utf-8") as f:
        for raw_line in f:
            line = raw_line.strip()
            if not line or line.startswith("#"):
                continue
            if "=" not in line:
                continue
            key, value = line.split("=", 1)
            key = key.strip()
            value = value.strip()
            if key and key not in os.environ:
                os.environ[key] = value


def get_mongodb_uri() -> Optional[str]:
    """Lấy MONGODB_URI từ env (.env, env.txt hoặc biến môi trường)."""
    # 1. Load từ .env nếu có
    if os.path.exists(DOTENV_PATH):
        load_dotenv(DOTENV_PATH, override=False)
    else:
        # Vẫn thử load mặc định (nếu có .env ở cwd)
        load_dotenv(override=False)

    # 2. Load thêm từ env.txt (chỉ set nếu chưa có)
    load_env_from_env_txt()

    return os.getenv("MONGODB_URI")


async def main() -> None:
    uri = get_mongodb_uri()

    if not uri:
        print(
            "❌ Không tìm thấy MONGODB_URI.\n"
            "- Thêm MONGODB_URI vào file `.env` trong thư mục `backend`, hoặc\n"
            "- Đảm bảo có dòng `MONGODB_URI=...` trong `backend/env.txt`."
        )
        return

    print(f"🔍 Đang thử kết nối MongoDB với URI (đã ẩn password, chỉ in prefix): {uri[:40]}...")

    client = AsyncIOMotorClient(uri, serverSelectionTimeoutMS=5000)

    try:
        await client.admin.command("ping")
        print("✅ Kết nối MongoDB thành công! `ping` OK.")
    except Exception as e:  # pragma: no cover - pure debug script
        print("❌ Kết nối MongoDB thất bại:")
        print(repr(e))
    finally:
        client.close()
        print("🔌 Đã đóng kết nối MongoDB.")


if __name__ == "__main__":
    asyncio.run(main())


