"""Environment configuration for the Telegram JWT bot."""

from __future__ import annotations

import os
from dataclasses import dataclass
from pathlib import Path

from dotenv import load_dotenv


load_dotenv()


def _csv_ints(value: str | None) -> set[int]:
    if not value:
        return set()
    result: set[int] = set()
    for item in value.split(","):
        item = item.strip()
        if item:
            result.add(int(item))
    return result


def _csv_strings(value: str | None, default: list[str]) -> list[str]:
    if not value:
        return default
    return [item.strip().lower() for item in value.split(",") if item.strip()]


@dataclass(frozen=True)
class Settings:
    bot_token: str
    admin_ids: set[int]
    allowed_group_ids: set[int]
    data_dir: Path
    api_timeout: float
    max_upload_size: int
    token_refresh_hours: int
    queue_mode: str
    servers: list[str]
    purposes: list[str]
    command_like100: str
    command_like200: str
    success_text_like100: str
    success_text_like200: str
    auto_upload_enabled: bool
    auto_upload_base_url: str
    auto_upload_token: str
    auto_upload_timeout: float
    debug: bool

    @property
    def uploads_dir(self) -> Path:
        return self.data_dir / "uploads"

    @property
    def generated_dir(self) -> Path:
        return self.data_dir / "generated"

    @property
    def failed_dir(self) -> Path:
        return self.data_dir / "failed"

    @property
    def db_path(self) -> Path:
        return self.data_dir / "bot.json"


def load_settings() -> Settings:
    queue_mode = os.getenv("QUEUE_MODE", "cycle").strip().lower()
    if queue_mode not in {"cycle", "stop"}:
        queue_mode = "cycle"

    settings = Settings(
        bot_token=os.getenv("BOT_TOKEN", "").strip(),
        admin_ids=_csv_ints(os.getenv("ADMIN_IDS")),
        allowed_group_ids=_csv_ints(os.getenv("ALLOWED_GROUP_IDS")),
        data_dir=Path(os.getenv("DATA_DIR", "./data")).resolve(),
        api_timeout=float(os.getenv("API_TIMEOUT", "30")),
        max_upload_size=int(os.getenv("MAX_UPLOAD_SIZE", str(2 * 1024 * 1024))),
        token_refresh_hours=max(1, int(os.getenv("TOKEN_REFRESH_HOURS", "7"))),
        queue_mode=queue_mode,
        servers=_csv_strings(
            os.getenv("SERVERS"),
            ["bd", "ind", "sg", "my", "pk", "vn", "th", "me", "br"],
        ),
        purposes=_csv_strings(
            os.getenv("PURPOSES"),
            ["like100", "like200", "free"],
        ),
        command_like100=os.getenv("COMMAND_LIKE100", "/gennext bd like100").strip(),
        command_like200=os.getenv("COMMAND_LIKE200", "/gennext bd like200").strip(),
        success_text_like100=os.getenv(
            "SUCCESS_TEXT_LIKE100",
            "100 like jwt generate success",
        ).strip(),
        success_text_like200=os.getenv(
            "SUCCESS_TEXT_LIKE200",
            "200 like jwt generate success",
        ).strip(),
        auto_upload_enabled=os.getenv("AUTO_UPLOAD_ENABLED", "false").strip().lower()
        in {"1", "true", "yes", "on"},
        auto_upload_base_url=os.getenv("AUTO_UPLOAD_BASE_URL", "").strip().rstrip("/"),
        auto_upload_token=os.getenv("AUTO_UPLOAD_TOKEN", "").strip(),
        auto_upload_timeout=float(os.getenv("AUTO_UPLOAD_TIMEOUT", os.getenv("API_TIMEOUT", "30"))),
        debug=os.getenv("DEBUG", "false").strip().lower() in {"1", "true", "yes", "on"},
    )
    if not settings.bot_token:
        raise RuntimeError("BOT_TOKEN is missing in .env")
    if not settings.admin_ids:
        raise RuntimeError("ADMIN_IDS is missing in .env")
    return settings


def ensure_data_dirs(settings: Settings) -> None:
    for path in (
        settings.data_dir,
        settings.uploads_dir,
        settings.generated_dir,
        settings.failed_dir,
    ):
        path.mkdir(parents=True, exist_ok=True)
