"""
config.py
----------
تمام تنظیمات پروژه از فایل .env خوانده می‌شود.
هیچ اطلاعات حساسی (توکن، آیدی ادمین و ...) نباید مستقیم داخل کد نوشته شود.
"""

import os
from pathlib import Path

from dotenv import load_dotenv


# ============================================================
# مسیر ریشه پروژه
# ============================================================

BASE_DIR = Path(__file__).resolve().parent

load_dotenv(BASE_DIR / ".env")


# ============================================================
# خواندن متغیرهای محیطی
# ============================================================

def _get_env(
    key: str,
    default: str | None = None,
    required: bool = False,
) -> str:
    value = os.getenv(key, default)

    if required and not value:
        raise RuntimeError(
            f"متغیر محیطی '{key}' در فایل .env تنظیم نشده است. "
            f"لطفاً فایل .env را بررسی کنید."
        )

    return value


# ============================================================
# ADMIN IDS
# ============================================================

def _parse_admin_ids(raw: str) -> list[int]:
    ids: list[int] = []

    for part in raw.split(","):
        part = part.strip()

        if not part:
            continue

        try:
            ids.append(int(part))
        except ValueError:
            raise RuntimeError(
                f"مقدار '{part}' در ADMIN_IDS یک عدد معتبر نیست."
            )

    if not ids:
        raise RuntimeError(
            "حداقل یک ADMIN_ID باید در فایل .env تعریف شود."
        )

    return ids


# ============================================================
# تنظیمات اصلی ربات
# ============================================================

BOT_TOKEN: str = _get_env(
    "BOT_TOKEN",
    required=True,
)

BOT_USERNAME: str = _get_env(
    "BOT_USERNAME",
    default="",
)

ADMIN_IDS: list[int] = _parse_admin_ids(
    _get_env(
        "ADMIN_IDS",
        required=True,
    )
)


# ============================================================
# دیتابیس
# ============================================================

DATABASE_URL: str = _get_env(
    "DATABASE_URL",
    default="sqlite+aiosqlite:///./data/bot.db",
)


# ============================================================
# پرداخت دستی
# ============================================================

CARD_NUMBER: str = _get_env(
    "CARD_NUMBER",
    default="وارد نشده",
)

CARD_HOLDER_NAME: str = _get_env(
    "CARD_HOLDER_NAME",
    default="وارد نشده",
)


# ============================================================
# اکانت تست
# ============================================================

TEST_ACCOUNT_LIMIT: int = int(
    _get_env(
        "TEST_ACCOUNT_LIMIT",
        default="1",
    )
)

TEST_ACCOUNT_DURATION_HOURS: int = int(
    _get_env(
        "TEST_ACCOUNT_DURATION_HOURS",
        default="1",
    )
)

TEST_ACCOUNT_VOLUME_GB: int = int(
    _get_env(
        "TEST_ACCOUNT_VOLUME_GB",
        default="2",
    )
)


# ============================================================
# مسیرها
# ============================================================

DATA_DIR = BASE_DIR / "data"
LOG_DIR = BASE_DIR / "logs"

DATA_DIR.mkdir(exist_ok=True)
LOG_DIR.mkdir(exist_ok=True)


# ============================================================
# بررسی ادمین
# ============================================================

def is_admin(telegram_id: int) -> bool:
    """بررسی می‌کند آیا یک کاربر ادمین است یا نه."""
    return telegram_id in ADMIN_IDS