"""ثبت فعالیت کاربران در جدول activity_log — پورت‌شده از core/logger.py دسکتاپ."""
import json

from app.extensions import db
from app.models.activity_log import ActivityLog

# لاگ‌هایی که entity_id شان شناسه‌ی مشتری است
CUSTOMER_ENTITY_TYPES = ("customer", "customer_tags", "customer_rating", "customer_next_call_date")


def log_action(user, action_type: str, entity_type: str = None, entity_id=None, details: dict = None):
    entry = ActivityLog(
        user_id=user.id if user else None,
        username=user.username if user else "system",
        action_type=action_type,
        entity_type=entity_type,
        entity_id=entity_id,
        details=details,
    )
    db.session.add(entry)
    db.session.commit()


def query_logs(action_type=None, search=None):
    """همه‌ی لاگ‌ها (نه فقط چندصدتای آخر) با فیلتر و جستجو داخل دیتابیس، جدیدترین اول."""
    from app.models.customer import Customer
    from app.services.customer_service import search_condition
    from app.services.jalali import to_en_digits

    query = ActivityLog.query
    if action_type:
        query = query.filter(ActivityLog.action_type == action_type)
    if search:
        text = search.strip()
        details_text = db.cast(ActivityLog.details, db.Text)
        conditions = []
        for variant in {text, to_en_digits(text)}:
            conditions.append(ActivityLog.username.icontains(variant, autoescape=True))
            conditions.append(details_text.icontains(variant, autoescape=True))
            # جزئیات به‌صورت JSON با \uXXXX ذخیره می‌شه؛ متن فارسی باید به همون شکل هم جستجو بشه
            escaped = json.dumps(variant)[1:-1]
            if escaped != variant:
                conditions.append(details_text.icontains(escaped, autoescape=True))
        # لاگ‌های مربوط به مشتری‌ای که اسم/شماره‌اش با جستجو می‌خونه (مثلاً «مشاهده»ی پرونده‌اش)
        matching_customers = db.session.query(Customer.id).filter(search_condition(text))
        conditions.append(db.and_(ActivityLog.entity_type.in_(CUSTOMER_ENTITY_TYPES),
                                  ActivityLog.entity_id.in_(matching_customers)))
        query = query.filter(db.or_(*conditions))
    return query.order_by(ActivityLog.id.desc())


def list_logs(limit=500, user_id=None, action_type=None):
    query = ActivityLog.query
    if user_id:
        query = query.filter(ActivityLog.user_id == user_id)
    if action_type:
        query = query.filter(ActivityLog.action_type == action_type)
    return query.order_by(ActivityLog.id.desc()).limit(limit).all()
