"""
Celery task for asynchronous Vencimiento CSV generation.
Mirrors the pattern of generate_saldos_temporales_async.
"""
import base64
import logging
from datetime import datetime
from typing import Dict, Any

from core.celery_app import celery_app
from core.email import EmailService

from .schemas import VencimientoFilter
from .service import generate_vencimiento_csv

logger = logging.getLogger(__name__)


@celery_app.task(bind=True, name="generate_vencimiento_csv_async")
def generate_vencimiento_csv_async(
    self,
    filter_data: Dict[str, Any],
    user_email: str = None,
):
    """
    Async Celery task: generate Reporte de Vencimiento CSV and optionally e-mail it.
    """
    try:
        # 1. Inicializando
        self.update_state(
            state="PROCESSING",
            meta={"current": 10, "total": 100, "status": "Inicializando reporte de Vencimiento..."},
        )

        # 2. Re-construir filtro
        filters = VencimientoFilter(**filter_data)

        # 3. Generar CSV con sesión de BD propia
        self.update_state(
            state="PROCESSING",
            meta={"current": 40, "total": 100, "status": "Generando datos de Vencimiento..."},
        )
        logger.info(
            f"Vencimiento task: building CSV "
            f"(days_ahead={filters.days_ahead}, currency={filters.currency})"
        )

        from core.database import CoreSessionLocal
        db = CoreSessionLocal()
        try:
            csv_bytes = generate_vencimiento_csv(filters, db)
        finally:
            db.close()

        # csv_bytes ya viene como bytes (utf-8-sig), necesitamos el string para email
        csv_content = csv_bytes.decode("utf-8-sig")

        # 4. Envío de correo opcional
        email_sent = False
        if filters.send_email and user_email:
            self.update_state(
                state="PROCESSING",
                meta={"current": 85, "total": 100, "status": "Enviando correo electrónico..."},
            )
            try:
                from asgiref.sync import async_to_sync

                filename = f"reporte_vencimiento_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
                result = async_to_sync(EmailService.send_report_email)(
                    recipient_email=user_email,
                    subject=f"Reporte de Vencimiento – {datetime.now().strftime('%d/%m/%Y')}",
                    body_text="Se adjunta el Reporte de Vencimiento generado.",
                    csv_content=csv_content,
                    filename=filename,
                )
                email_sent = bool(result)
            except Exception as e:
                logger.error(f"Vencimiento task: email error: {e}")

        # 5. Codificar a base64 y retornar
        self.update_state(
            state="PROCESSING",
            meta={"current": 95, "total": 100, "status": "Finalizando..."},
        )

        content_b64 = base64.b64encode(csv_bytes).decode("utf-8")
        filename = f"reporte_vencimiento_{datetime.now().strftime('%Y%m%d')}.csv"

        return {
            "status": "success",
            "file_name": filename,
            "content": content_b64,
            "media_type": "text/csv",
            "email_sent": email_sent,
        }

    except Exception as e:
        logger.error(f"Error in generate_vencimiento_csv_async: {e}", exc_info=True)
        self.update_state(
            state="FAILURE",
            meta={
                "exc_type": type(e).__name__,
                "exc_message": str(e),
                "custom": "Error generating Vencimiento report",
            },
        )
        raise
