"""90 gün sonra PII anonimleştirme — Celery beat job.

KVKK: kvkk_consent_at üzerinden 90 gün geçen ziyaretçilerin PII'si silinir.
NOT: Async DB erişimi worker içinde ayrı event loop ile çalıştırılır.
"""
import asyncio
import logging
from datetime import UTC, datetime, timedelta

from sqlalchemy import or_, select

from app.database import AsyncSessionFactory
from app.models.visitor import FlovyVisitor
from app.tasks.celery_app import celery_app

logger = logging.getLogger("flovy")

RETENTION_DAYS = 90


async def _anonymize_expired() -> int:
    cutoff = datetime.now(UTC).replace(tzinfo=None) - timedelta(days=RETENTION_DAYS)
    count = 0
    async with AsyncSessionFactory() as db:
        result = await db.execute(
            select(FlovyVisitor).where(
                FlovyVisitor.anonymized_at.is_(None),
                FlovyVisitor.kvkk_consent_at.is_not(None),
                FlovyVisitor.kvkk_consent_at < cutoff,
                or_(
                    FlovyVisitor.email.is_not(None),
                    FlovyVisitor.phone.is_not(None),
                    FlovyVisitor.name.is_not(None),
                ),
            )
        )
        now = datetime.now(UTC).replace(tzinfo=None)
        for visitor in result.scalars().all():
            visitor.email = None
            visitor.phone = None
            visitor.name = None
            visitor.products_viewed = []
            visitor.products_purchased = []
            visitor.cart_abandoned = None
            visitor.anonymized_at = now
            count += 1
        await db.commit()
    logger.info("anonymize_pii: %d ziyaretçi anonimleştirildi", count)
    return count


@celery_app.task(name="anonymize_pii")
def anonymize_pii() -> int:
    return asyncio.run(_anonymize_expired())
