from sqlalchemy.orm import Session
from sqlalchemy import and_
from app.db.models import TelegramBot, TenantSettings
from app.core.config import get_settings
from app.utils.encryption import decrypt_token


async def choose_telegram_sender(tenant_id: int, db: Session = None) -> str | None:
    """
    Выбрать токен бота для отправки сообщений
    
    Returns:
        str: Токен бота для отправки (системного или бренд-бота)
        None: Если нет доступных ботов
    """
    settings = get_settings()
    
    if db is None:
        from app.db.session import SessionLocal
        db = SessionLocal()
        try:
            return await _choose_sender_impl(tenant_id, db)
        finally:
            db.close()
    else:
        return await _choose_sender_impl(tenant_id, db)


async def _choose_sender_impl(tenant_id: int, db: Session) -> str | None:
    """Внутренняя реализация выбора отправителя"""
    settings = get_settings()
    
    # Получаем настройки тенанта
    tenant_settings = db.query(TenantSettings).filter(
        TenantSettings.tenant_id == tenant_id
    ).first()
    
    # Если Telegram отключен, возвращаем None
    if tenant_settings and tenant_settings.tg_sender == "disabled":
        return None
    
    # Если настроен бренд-бот, используем его
    if tenant_settings and tenant_settings.tg_sender == "brand":
        bot = db.query(TelegramBot).filter(
            and_(
                TelegramBot.tenant_id == tenant_id,
                TelegramBot.status == "active"
            )
        ).first()
        
        if bot:
            # Расшифровываем токен бренд-бота
            decrypted_token = decrypt_token(bot.bot_token_enc)
            if decrypted_token:
                return decrypted_token
    
    # Fallback на системный бот (только если не отключен)
    if settings.SYSTEM_TG_BOT_TOKEN:
        return settings.SYSTEM_TG_BOT_TOKEN
    
    # Если нет системного бота, используем legacy токен
    if settings.TELEGRAM_BOT_TOKEN:
        return settings.TELEGRAM_BOT_TOKEN
    
    return None


async def get_telegram_username(tenant_id: int, db: Session = None) -> str:
    """Получить username бота для отображения"""
    settings = get_settings()
    
    if db is None:
        from app.db.session import SessionLocal
        db = SessionLocal()
        try:
            return await _get_username_impl(tenant_id, db)
        finally:
            db.close()
    else:
        return await _get_username_impl(tenant_id, db)


async def _get_username_impl(tenant_id: int, db: Session) -> str:
    """Внутренняя реализация получения username"""
    settings = get_settings()
    
    # Получаем настройки тенанта
    tenant_settings = db.query(TenantSettings).filter(
        TenantSettings.tenant_id == tenant_id
    ).first()
    
    # Если настроен бренд-бот, используем его username
    if tenant_settings and tenant_settings.tg_sender == "brand":
        bot = db.query(TelegramBot).filter(
            and_(
                TelegramBot.tenant_id == tenant_id,
                TelegramBot.status == "active"
            )
        ).first()
        
        if bot and bot.username:
            return f"@{bot.username}"
    
    # Fallback на системный бот
    return settings.SYSTEM_TG_BOT_USERNAME


def is_brand_bot_active(tenant_id: int, db: Session) -> bool:
    """Проверить активен ли бренд-бот для тенанта"""
    tenant_settings = db.query(TenantSettings).filter(
        TenantSettings.tenant_id == tenant_id
    ).first()
    
    if not tenant_settings or tenant_settings.tg_sender != "brand":
        return False
    
    bot = db.query(TelegramBot).filter(
        and_(
            TelegramBot.tenant_id == tenant_id,
            TelegramBot.status == "active"
        )
    ).first()
    
    return bot is not None
