"""
Utility functions for the Telegram bot
"""

import urllib.parse
from typing import Dict, Any, Optional


def generate_deep_link(bot_username: str, param_type: str, value: str = "") -> str:
    """
    Generate deep link for the bot

    Args:
        bot_username: Telegram bot username (without @)
        param_type: Type of parameter (reward, quiz, shop, reward_item)
        value: Value for the parameter (e.g., reward amount, quiz ID)

    Returns:
        Deep link URL
    """
    if param_type == "shop":
        startapp = "shop"
    elif param_type == "reward":
        startapp = f"reward_{value}"
    elif param_type == "quiz":
        startapp = f"quiz_{value}"
    elif param_type == "reward_item":
        startapp = f"reward_{value}"
    else:
        startapp = ""

    if startapp:
        return f"https://t.me/{bot_username}?startapp={startapp}"
    else:
        return f"https://t.me/{bot_username}"


def generate_qr_content(deep_link: str) -> str:
    """
    Generate content for QR code

    Args:
        deep_link: The deep link to encode in QR

    Returns:
        QR content (URL encoded)
    """
    return urllib.parse.quote(deep_link)


def parse_startapp_parameter(startapp: str) -> Dict[str, Any]:
    """
    Parse startapp parameter from deep link

    Args:
        startapp: The startapp parameter from Telegram

    Returns:
        Dictionary with parsed data
    """
    if not startapp:
        return {"type": "main"}

    if startapp.startswith("reward_"):
        try:
            amount = int(startapp.split("_")[1])
            return {"type": "reward", "amount": amount}
        except (IndexError, ValueError):
            return {"type": "main"}

    elif startapp.startswith("quiz_"):
        quiz_id = startapp.split("_")[1]
        return {"type": "quiz", "quiz_id": quiz_id}

    elif startapp == "shop":
        return {"type": "shop"}

    elif startapp.startswith("reward_"):
        reward_id = startapp.split("_")[1]
        return {"type": "reward_item", "reward_id": reward_id}

    else:
        return {"type": "main"}


def get_welcome_message(param_data: Dict[str, Any]) -> str:
    """
    Get welcome message based on parsed parameter

    Args:
        param_data: Parsed parameter data

    Returns:
        Welcome message text
    """
    param_type = param_data.get("type", "main")

    messages = {
        "main": (
            "🌟 Добро пожаловать в <b>Звёздные Викторины</b>!\n\n"
            "Проходите викторины, сканируйте QR-коды и получайте звёзды, "
            "которые можно обменять на призы!"
        ),
        "reward": (
            f"🎁 Поздравляем! Вы получили {param_data.get('amount', 0)} ⭐\n\n"
            "Откройте мини-приложение, чтобы использовать свои звёзды!"
        ),
        "quiz": (
            "🧠 Готовы проверить свои знания?\n\n"
            "Откройте викторину и начните проходить!"
        ),
        "shop": (
            "🛒 Добро пожаловать в магазин призов!\n\n"
            "Обменивайте звёзды на замечательные призы!"
        ),
        "reward_item": (
            "🎁 Специальный приз ждет вас!\n\n"
            "Откройте магазин, чтобы узнать подробности!"
        )
    }

    return messages.get(param_type, messages["main"])


def validate_reward_amount(amount: int) -> bool:
    """
    Validate reward amount

    Args:
        amount: Reward amount to validate

    Returns:
        True if valid, False otherwise
    """
    return isinstance(amount, int) and amount > 0 and amount <= 1000


def validate_quiz_id(quiz_id: str) -> bool:
    """
    Validate quiz ID

    Args:
        quiz_id: Quiz ID to validate

    Returns:
        True if valid, False otherwise
    """
    return isinstance(quiz_id, str) and len(quiz_id) > 0 and quiz_id.isalnum()