"""
Script de exportación de datos para migración del módulo Guías a un nuevo proyecto.

Exporta:
- Empresas con `guias_despacho` asignado (Demo + MLP), normalizando `modulos_asignados`
  a solo ['guias_despacho'] (el nuevo proyecto no tendrá los otros módulos).
- Usuarios de esas empresas (con password_hash bcrypt original, totalmente portable).
- Superadmin global.
- Configuración por empresa (tipos de documento, etiqueta sección empresa).
- Configuración de notificaciones push por empresa (matriz rol×evento).

NO exporta: documentos, archivos GridFS, historial, suscripciones push (las suscripciones
push están atadas al dominio del navegador y deben rehacerse en guidepach.cl).

Uso:
    python3 /app/backend/scripts/export_guias_data.py

Salida: /app/migration_export.json (committeable en GitHub para que el nuevo proyecto lo importe).
"""
import asyncio
import json
import os
from datetime import datetime
from motor.motor_asyncio import AsyncIOMotorClient
from dotenv import load_dotenv

load_dotenv('/app/backend/.env')

# Lista blanca de usuarios reales (excluye test users)
EXCLUDED_EMAILS = {
    'test_1773373876@demo.com',
    'edituser@test.cl',
}

# Roles válidos del módulo Guías (descartar otros como 'tecnico', 'usuario', etc.)
ROLES_VALIDOS = {'superadmin', 'admin', 'gerente', 'solicitante', 'seguridad'}


async def main():
    client = AsyncIOMotorClient(os.environ['MONGO_URL'])
    db = client[os.environ['DB_NAME']]

    export = {
        'meta': {
            'source': 'multisistemas.cl',
            'exported_at': datetime.utcnow().isoformat() + 'Z',
            'description': 'Export del módulo Guías de Despacho para migración a guidepach.cl',
            'version': 1,
        },
        'empresas': [],
        'usuarios': [],
        'configuracion_guias': [],
        'guias_push_config': [],
    }

    # 1. Empresas con guias_despacho
    empresas_ids = []
    async for e in db.empresas.find({'modulos_asignados': 'guias_despacho'}, {'_id': 0}):
        # Normalizar: el nuevo proyecto solo tendrá módulo guias_despacho
        e['modulos_asignados'] = ['guias_despacho']
        export['empresas'].append(e)
        empresas_ids.append(e['id'])

    # 2. Usuarios de esas empresas + superadmins globales
    query = {
        '$or': [
            {'empresa_id': {'$in': empresas_ids}},
            {'rol': 'superadmin'},
        ]
    }
    async for u in db.usuarios.find(query, {'_id': 0}):
        # Filtrar test users
        if u.get('email', '').lower() in EXCLUDED_EMAILS:
            continue
        # Filtrar roles inválidos
        if u.get('rol') not in ROLES_VALIDOS:
            continue
        export['usuarios'].append(u)

    # 3. Config Guías por empresa
    async for c in db.configuracion_guias.find({'empresa_id': {'$in': empresas_ids}}, {'_id': 0}):
        export['configuracion_guias'].append(c)

    # 4. Push config por empresa
    async for p in db.guias_push_config.find({'empresa_id': {'$in': empresas_ids}}, {'_id': 0}):
        export['guias_push_config'].append(p)

    # Escribir archivo
    out_path = '/app/migration_export.json'
    with open(out_path, 'w', encoding='utf-8') as f:
        json.dump(export, f, indent=2, ensure_ascii=False, default=str)

    # Resumen
    print('=' * 60)
    print('EXPORTACIÓN COMPLETADA')
    print('=' * 60)
    print(f'  Archivo: {out_path}')
    print(f'  Tamaño:  {os.path.getsize(out_path)/1024:.2f} KB')
    print()
    print(f'  Empresas:             {len(export["empresas"])}')
    for e in export['empresas']:
        print(f'    - {e["nombre"]} ({e["subdominio"]}) | módulos: {e["modulos_asignados"]}')
    print()
    print(f'  Usuarios:             {len(export["usuarios"])}')
    for u in export['usuarios']:
        emp = next((e['nombre'] for e in export['empresas'] if e['id'] == u.get('empresa_id')), 'GLOBAL')
        print(f'    - {u["email"]:<40} rol={u["rol"]:<12} empresa={emp}')
    print()
    print(f'  Configuración Guías:  {len(export["configuracion_guias"])}')
    print(f'  Push config:          {len(export["guias_push_config"])}')
    print('=' * 60)


if __name__ == '__main__':
    asyncio.run(main())
