"""
Migracion ETL: CLIENTESMIG (SQL Express viejo) -> LicenciasMIG (VPS).

Uso:
    python migrate_from_clientesmig.py

Lee credenciales de variables de entorno:
    SRC_SERVER, SRC_USER, SRC_PASSWORD          (Windows: DESKTOP-O5APCBU\\SQLEXPRESS2019)
    DEST_SERVER, DEST_USER, DEST_PASSWORD       (VPS: localhost o 194.163.45.32)
    DEST_DATABASE   (default: LicenciasMIG)
    SRC_DATABASE    (default: CLIENTESMIG)

Idempotente: vuelve a correrlo y solo agrega lo que falta.
"""
import os
import sys
import pyodbc
from datetime import datetime

DRIVER = os.getenv('ODBC_DRIVER', 'ODBC Driver 17 for SQL Server')

SRC_SERVER   = os.getenv('SRC_SERVER',   r'DESKTOP-O5APCBU\SQLEXPRESS2019')
SRC_DATABASE = os.getenv('SRC_DATABASE', 'CLIENTESMIG')
SRC_USER     = os.getenv('SRC_USER',     'sa')
SRC_PASSWORD = os.getenv('SRC_PASSWORD', '')

DEST_SERVER   = os.getenv('DEST_SERVER',   'localhost')
DEST_DATABASE = os.getenv('DEST_DATABASE', 'LicenciasMIG')
DEST_USER     = os.getenv('DEST_USER',     'sa')
DEST_PASSWORD = os.getenv('DEST_PASSWORD', '')


def connect(server, db, user, pwd):
    return pyodbc.connect(
        f'DRIVER={{{DRIVER}}};SERVER={server};DATABASE={db};UID={user};PWD={pwd};'
        'TrustServerCertificate=yes;Encrypt=yes;'
    )


def migrate_empresas(src, dest):
    print('--- Migrando Empresas ---')
    src_cur = src.cursor()
    src_cur.execute("""
        WITH dedupe AS (
            SELECT *,
                   ROW_NUMBER() OVER (PARTITION BY nit ORDER BY fecharegistro DESC) AS rn
            FROM dbo.Empresas
            WHERE nit IS NOT NULL AND LTRIM(RTRIM(nit)) <> ''
        )
        SELECT nit, razonsocial, nombrecomercial, direccion, telefono, celular,
               ISNULL(mensualidad, 0), ISNULL(regulariza, 0), tipotpv,
               ISNULL(fecharegistro, GETDATE()), ISNULL(fechaactualizacion, GETDATE()),
               claveproducto, nombreequipo, osversion
        FROM dedupe WHERE rn = 1
    """)
    rows = src_cur.fetchall()
    print(f'   leidas {len(rows)} empresas en origen')

    dest_cur = dest.cursor()
    dest_cur.execute('SELECT nit FROM dbo.Empresas')
    existing = {r[0] for r in dest_cur.fetchall()}

    insert_sql = """
        INSERT INTO dbo.Empresas (
            nit, razonsocial, nombrecomercial, direccion, telefono, celular,
            mensualidad, regulariza, tipotpv,
            fecharegistro, fechaactualizacion,
            claveproducto, nombreequipo, osversion
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    """
    insertadas = 0
    for r in rows:
        if r[0] in existing:
            continue
        dest_cur.execute(insert_sql, *r)
        insertadas += 1
    dest.commit()
    print(f'   insertadas {insertadas} empresas nuevas')


def migrate_licencias(src, dest):
    print('--- Migrando LicenciasEmpresas ---')
    src_cur = src.cursor()
    src_cur.execute("""
        SELECT nit, razonsocial, nombrecomercial, direccion, telefono, celular,
               iddepartamento, idciudad, ISNULL(licenciatemporal, 0),
               ISNULL(fecharegistro, GETDATE()),
               responsable, correoresponsable, telefonoponsable, motivolicencia,
               claveproducto, nombreequipo, osversion, clavemes,
               ISNULL(licenciaactiva, 1), ISNULL(bloquearlicencia, 0)
        FROM dbo.LicenciasEmpresas
        WHERE nit IS NOT NULL AND LTRIM(RTRIM(nit)) <> ''
    """)
    rows = src_cur.fetchall()
    print(f'   leidas {len(rows)} licencias en origen')

    dest_cur = dest.cursor()
    dest_cur.execute('SELECT nit FROM dbo.Empresas')
    nits_validos = {r[0] for r in dest_cur.fetchall()}

    # Solo migrar licencias cuya empresa ya existe (FK logica)
    rows = [r for r in rows if r[0] in nits_validos]
    print(f'   {len(rows)} licencias con empresa valida')

    # Limpiar antes de re-importar (las licencias no tienen unique key natural)
    dest_cur.execute('DELETE FROM dbo.LicenciasEmpresas')
    dest.commit()

    insert_sql = """
        INSERT INTO dbo.LicenciasEmpresas (
            nit, razonsocial, nombrecomercial, direccion, telefono, celular,
            iddepartamento, idciudad, licenciatemporal, fecharegistro,
            responsable, correoresponsable, telefonoponsable, motivolicencia,
            claveproducto, nombreequipo, osversion, clavemes,
            licenciaactiva, bloquearlicencia
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    """
    insertadas = 0
    for r in rows:
        dest_cur.execute(insert_sql, *r)
        insertadas += 1
    dest.commit()
    print(f'   insertadas {insertadas} licencias')


def main():
    if not SRC_PASSWORD or not DEST_PASSWORD:
        print('ERROR: definir SRC_PASSWORD y DEST_PASSWORD en variables de entorno.')
        sys.exit(1)

    print(f'Origen:  {SRC_SERVER} / {SRC_DATABASE}')
    print(f'Destino: {DEST_SERVER} / {DEST_DATABASE}')
    print('---')

    t0 = datetime.now()
    src = connect(SRC_SERVER, SRC_DATABASE, SRC_USER, SRC_PASSWORD)
    dest = connect(DEST_SERVER, DEST_DATABASE, DEST_USER, DEST_PASSWORD)

    try:
        migrate_empresas(src, dest)
        migrate_licencias(src, dest)
    finally:
        src.close()
        dest.close()

    print(f'--- Listo en {(datetime.now() - t0).total_seconds():.1f}s ---')


if __name__ == '__main__':
    main()
