"""
Ejemplo de configuración de BullMQ Flow compatible con ejecución manual desde dashboard.

Este archivo proporciona ejemplos de configuraciones de flow que siguen el estándar
de BullMQ para Job Name, Job Data, y Job Options, permitiendo ejecución manual
desde el dashboard de BullMQ.
"""

from datetime import datetime
from bullmq_py.bullmq_flow import bullmq_flow

def ejemplo_flow_manual():
    """
    Ejemplo de flow configurado para ejecución manual desde dashboard.
    
    Estructura estándar de BullMQ:
    - Job Name: Identificador claro y descriptivo
    - Job Data: Datos del trabajo en formato JSON
    - Job Options: priority, delay, attempts, etc.
    """
    
    flow_config = {
        "name": "user-signup-flow",
        "queueName": "user_management",
        "data": {
            # Datos del job padre - JSON serializable
            "user_id": "user_12345",
            "email": "user@example.com",
            "signup_timestamp": datetime.now().isoformat(),
            "source": "web_signup_form"
        },
        "opts": {
            # Opciones del job padre
            "priority": 8,
            "attempts": 3,
            "jobId": "USER_SIGNUP_PARENT_001"  # Nombre claro para dashboard
        },
        "children": [
            {
                "name": "send-welcome-email",
                "queueName": "email_service",
                "data": {
                    # Datos específicos del child
                    "email_type": "welcome",
                    "recipient": "user@example.com",
                    "template": "welcome_template_v2",
                    "personalization": {
                        "first_name": "Usuario",
                        "signup_bonus": 100
                    }
                },
                "opts": {
                    "priority": 9,  # Alta prioridad para emails
                    "attempts": 5,  # Más reintentos para emails críticos
                    "jobId": "WELCOME_EMAIL_001"
                }
            },
            {
                "name": "create-user-profile",
                "queueName": "user_service",
                "data": {
                    "action": "create_profile",
                    "user_id": "user_12345",
                    "default_settings": {
                        "theme": "light",
                        "notifications": True,
                        "newsletter": True
                    }
                },
                "opts": {
                    "priority": 7,
                    "attempts": 3,
                    "jobId": "CREATE_PROFILE_001"
                }
            },
            {
                "name": "schedule-followup-email",
                "queueName": "email_service", 
                "data": {
                    "email_type": "followup",
                    "recipient": "user@example.com",
                    "template": "day7_followup",
                    "schedule_info": "7 days after signup"
                },
                "opts": {
                    "delay": 604800000,  # 7 días en milisegundos
                    "priority": 5,
                    "attempts": 3,
                    "jobId": "FOLLOWUP_EMAIL_001"
                }
            },
            {
                "name": "analytics-tracking",
                "queueName": "analytics_service",
                "data": {
                    "event": "user_signup",
                    "user_id": "user_12345",
                    "properties": {
                        "source": "web_signup_form",
                        "timestamp": datetime.now().isoformat(),
                        "user_agent": "Mozilla/5.0...",
                        "ip_address": "192.168.1.100"
                    }
                },
                "opts": {
                    "priority": 3,  # Baja prioridad para analytics
                    "attempts": 2,
                    "jobId": "ANALYTICS_SIGNUP_001"
                }
            }
        ]
    }
    
    return flow_config

def ejemplo_flow_ecommerce():
    """
    Ejemplo de flow para procesamiento de pedido de e-commerce.
    """
    
    flow_config = {
        "name": "order-processing-flow",
        "queueName": "order_management",
        "data": {
            "order_id": "ORD_2026_001234",
            "customer_id": "CUST_56789",
            "total_amount": 150.99,
            "currency": "USD",
            "items": [
                {"sku": "PROD_001", "quantity": 2, "price": 49.99},
                {"sku": "PROD_002", "quantity": 1, "price": 51.01}
            ]
        },
        "opts": {
            "priority": 9,  # Alta prioridad para pedidos
            "attempts": 5,
            "jobId": "ORDER_PROCESSING_001234"
        },
        "children": [
            {
                "name": "validate-inventory",
                "queueName": "inventory_service",
                "data": {
                    "action": "validate_stock",
                    "order_id": "ORD_2026_001234",
                    "items_to_check": [
                        {"sku": "PROD_001", "quantity": 2},
                        {"sku": "PROD_002", "quantity": 1}
                    ]
                },
                "opts": {
                    "priority": 10,  # Máxima prioridad
                    "attempts": 3,
                    "jobId": "INVENTORY_CHECK_001234"
                }
            },
            {
                "name": "process-payment",
                "queueName": "payment_service",
                "data": {
                    "action": "charge_payment",
                    "order_id": "ORD_2026_001234",
                    "amount": 150.99,
                    "currency": "USD",
                    "payment_method": "credit_card_****1234"
                },
                "opts": {
                    "priority": 9,
                    "attempts": 3,
                    "delay": 2000,  # 2 segundos delay después de validar inventario
                    "jobId": "PAYMENT_CHARGE_001234"
                }
            },
            {
                "name": "generate-invoice",
                "queueName": "billing_service",
                "data": {
                    "action": "create_invoice",
                    "order_id": "ORD_2026_001234",
                    "customer_id": "CUST_56789",
                    "invoice_format": "PDF",
                    "send_email": True
                },
                "opts": {
                    "priority": 6,
                    "attempts": 3,
                    "delay": 5000,  # 5 segundos delay
                    "jobId": "INVOICE_GENERATION_001234"
                }
            },
            {
                "name": "schedule-shipment",
                "queueName": "fulfillment_service",
                "data": {
                    "action": "create_shipment",
                    "order_id": "ORD_2026_001234",
                    "shipping_method": "standard",
                    "estimated_delivery": "3-5 business days"
                },
                "opts": {
                    "priority": 7,
                    "attempts": 3,
                    "delay": 10000,  # 10 segundos delay
                    "jobId": "SHIPMENT_SCHEDULE_001234"
                }
            }
        ]
    }
    
    return flow_config

def manual_execution_guide():
    """
    Guía para ejecutar jobs manualmente desde el dashboard de BullMQ.
    """
    print("🎯 GUÍA PARA EJECUCIÓN MANUAL DESDE BULLMQ DASHBOARD")
    print("=" * 60)
    
    print("\\n1. ESTRUCTURA DE JOB ESTÁNDAR:")
    print("   - Job Name: Identificador descriptivo (ej: 'USER_SIGNUP_PARENT_001')")
    print("   - Job Data: JSON con los datos del trabajo")
    print("   - Job Options: Configuración (priority, delay, attempts, etc.)")
    
    print("\\n2. PASOS PARA EJECUCIÓN MANUAL:")
    print("   a) Abrir BullMQ Dashboard")
    print("   b) Seleccionar la cola apropiada")
    print("   c) Hacer clic en 'Add Job'")
    print("   d) Completar los campos:")
    print("      * Job Name: Usar el nombre del ejemplo")
    print("      * Job Data: Copiar el JSON de data")
    print("      * Job Options: Copiar las opciones")
    
    print("\\n3. EJEMPLO DE USO:")
    
    # Mostrar ejemplo de user signup
    signup_config = ejemplo_flow_manual()
    
    print("\\n   PARENT JOB (Cola: user_management):")
    print(f"   Job Name: {signup_config['opts']['jobId']}")
    print("   Job Data:")
    import json
    print(json.dumps(signup_config['data'], indent=4))
    print("   Job Options:")
    print(json.dumps(signup_config['opts'], indent=4))
    
    print("\\n   CHILD JOBS:")
    for i, child in enumerate(signup_config['children']):
        print(f"\\n   Child {i+1} (Cola: {child['queueName']}):")
        print(f"   Job Name: {child['opts']['jobId']}")
        print("   Job Data:")
        print(json.dumps(child['data'], indent=4))
        print("   Job Options:")
        print(json.dumps(child['opts'], indent=4))
    
    print("\\n✅ Los jobs creados con bullmq_flow() siguen esta estructura")
    print("   y pueden ejecutarse manualmente copiando estos datos.")

if __name__ == "__main__":
    print("🚀 BullMQ Flow - Ejemplos de Configuración Manual")
    print("=" * 60)
    
    # Mostrar guía de ejecución manual
    manual_execution_guide()
    
    # Crear ejemplo de flow para demostrar
    print("\\n\\n🔧 CREANDO FLOW DE EJEMPLO...")
    
    try:
        # Crear flow de signup
        signup_flow = ejemplo_flow_manual()
        result = bullmq_flow(signup_flow)
        
        print(f"\\n✅ Flow creado exitosamente: {result['flow_id']}")
        print(f"   Parent: {result['parent_job']['job_id']}")
        print(f"   Children: {len(result['children'])} jobs")
        
        print("\\n🎯 Puedes ahora:")
        print("1. Ver estos jobs en el dashboard de BullMQ")
        print("2. Ejecutar jobs similares manualmente usando los datos mostrados arriba")
        print("3. Copiar y modificar las configuraciones para tus propios flows")
        
    except Exception as e:
        print(f"❌ Error creando flow: {e}")
        print("Asegúrate de que Redis esté ejecutándose y accessible")