from datetime import datetime, timezone

import telebot

from app.extensions.db import db
from app.models.users import Users
from app.models.regions import Regions
from app.models.subscriptions import Subscriptions
from app.models.userevents import UserEvents


def is_whitelisted(chat_id: int) -> tuple[bool, str | None]:
    """Проверяет, есть ли пользователь с заданным chat_id и не заблокирован ли он."""
    user = Users.query.filter_by(chat_id=chat_id).first()
    if user:
        if user.is_blocked:
            return False, "Ваш доступ заблокирован."
        return True, None
    return False, None


def get_sorted_regions() -> list[tuple[int, str]]:
    """Возвращает список всех активных регионов, отсортированных по region_id."""
    return (
        Regions.query
        .filter_by(active=True)
        .with_entities(Regions.region_id, Regions.region_name)
        .order_by(Regions.region_id.asc())
        .all()
    )


def get_user_subscribed_regions(chat_id: int) -> list[tuple[int, str]]:
    """Возвращает список активных подписанных регионов пользователя."""
    regions = (
        Regions.query
        .join(Subscriptions, Subscriptions.region_id == Regions.region_id)
        .filter(
            Subscriptions.chat_id == chat_id,
            Subscriptions.active.is_(True),
            Subscriptions.skip.is_(False),
            Regions.active.is_(True)
        )
        .with_entities(Regions.region_id, Regions.region_name)
        .order_by(Regions.region_id.asc())
        .all()
    )
    return regions


def format_regions_list(regions: list[tuple[int, str]]) -> str:
    """Форматирует список регионов для отображения."""
    return '\n'.join(f"{region_id} - {region_name}" for region_id, region_name in regions)


