import calendar
import datetime as dt
import re
import secrets

from flask import current_app

# أرقام عربية/فارسية ← أرقام لاتينية
_AR_DIGITS = str.maketrans("٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹", "01234567890123456789")

# أحرف الكود بدون الملتبس (0/O و 1/I)
CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"

_USERNAME_RE = re.compile(r"^(?=.*[A-Za-z])[A-Za-z0-9_.]{3,30}$")


def today_local() -> dt.date:
    """تاريخ اليوم بتوقيت العراق (مهم لحدود يوم 1 وانتهاء الاشتراك)."""
    offset = dt.timezone(dt.timedelta(hours=current_app.config["TZ_OFFSET_HOURS"]))
    return dt.datetime.now(offset).date()


def add_months(d: dt.date, months: int) -> dt.date:
    m = d.month - 1 + months
    y = d.year + m // 12
    m = m % 12 + 1
    return dt.date(y, m, min(d.day, calendar.monthrange(y, m)[1]))


def generate_trainee_code() -> str:
    return "".join(secrets.choice(CODE_ALPHABET) for _ in range(8))


def normalize_phone(raw):
    """يحوّل 07701234567 / +964 770 123 4567 / ٠٧٧٠... إلى 9647701234567.
    يرجع None إن كان فارغاً، ويرفع ValueError إن كان غير صالح."""
    if raw is None:
        return None
    s = re.sub(r"[\s\-().]", "", str(raw).translate(_AR_DIGITS))
    if not s:
        return None
    if s.startswith("+"):
        s = s[1:]
    if not s.isdigit():
        raise ValueError("phone")
    if s.startswith("00"):
        s = s[2:]
    if s.startswith("0") and len(s) == 11:      # 07XXXXXXXXX
        s = "964" + s[1:]
    elif s.startswith("7") and len(s) == 10:    # 7XXXXXXXXX
        s = "964" + s
    if not 10 <= len(s) <= 15:
        raise ValueError("phone")
    return s


def normalize_username(raw):
    if raw is None:
        return None
    s = str(raw).strip().lower()
    if not s:
        return None
    if not _USERNAME_RE.match(s):
        raise ValueError("username")
    return s


def looks_like_phone(text: str) -> bool:
    return bool(re.fullmatch(r"\+?[\d\s\-().]{7,}", text.translate(_AR_DIGITS)))


def whatsapp_url(phone):
    return f"https://wa.me/{phone}" if phone else None
