#!/usr/bin/env python3
"""
Script para migrar contraseñas de agentes de 3-4 dígitos a 6 dígitos
Genera contraseñas seguras y crea archivo de notificación
"""

import random
import string
import pymysql
import datetime
import os
import sys

# Configuración
CONFIG_FILE = '/etc/centralita-tarot/config.env'
OUTPUT_DIR = '/var/www/html/MEJORAS_FASE1_20250731/docs'
BACKUP_FILE = f"{OUTPUT_DIR}/agent_passwords_backup_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
NEW_PASSWORDS_FILE = f"{OUTPUT_DIR}/new_agent_passwords_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"

def load_config():
    """Carga configuración desde archivo .env"""
    config = {}
    if os.path.exists(CONFIG_FILE):
        with open(CONFIG_FILE, 'r') as f:
            for line in f:
                line = line.strip()
                if line and not line.startswith('#') and '=' in line:
                    key, value = line.split('=', 1)
                    config[key.strip()] = value.strip()
    return config

def generate_secure_password():
    """Genera contraseña segura de 6 dígitos"""
    return ''.join(random.choices(string.digits, k=6))

def main():
    # Cargar configuración
    config = load_config()
    
    # Conectar a BD
    try:
        conn = pymysql.connect(
            host=config.get('DB_HOST', 'localhost'),
            user=config.get('DB_USER'),
            password=config.get('DB_PASSWORD'),
            database=config.get('DB_NAME_ASTERISK', 'asterisk'),
            charset='utf8mb4'
        )
        cursor = conn.cursor()
        
        # 1. Backup de contraseñas actuales
        print("1. Creando backup de contraseñas actuales...")
        cursor.execute("""
            SELECT usuario, nombre, password, telefono, email 
            FROM agentes 
            WHERE activo = 1 AND LENGTH(password) < 6
            ORDER BY usuario
        """)
        
        agents = cursor.fetchall()
        
        # Guardar backup
        with open(BACKUP_FILE, 'w') as f:
            f.write("usuario,nombre,password_actual,telefono,email\n")
            for agent in agents:
                f.write(f"{agent[0]},{agent[1]},{agent[2]},{agent[3] or ''},{agent[4] or ''}\n")
        
        print(f"   Backup guardado en: {BACKUP_FILE}")
        print(f"   Total agentes a migrar: {len(agents)}")
        
        # 2. Generar nuevas contraseñas
        print("\n2. Generando nuevas contraseñas...")
        new_passwords = []
        
        with open(NEW_PASSWORDS_FILE, 'w') as f:
            f.write("NUEVAS CONTRASEÑAS DE AGENTES - SISTEMA CENTRALITA TAROT\n")
            f.write(f"Fecha: {datetime.datetime.now().strftime('%d/%m/%Y %H:%M')}\n")
            f.write("="*60 + "\n\n")
            f.write("Código | Nombre                | Contraseña Anterior | Nueva Contraseña\n")
            f.write("-"*70 + "\n")
            
            for agent in agents:
                usuario, nombre, old_pass = agent[0], agent[1], agent[2]
                new_pass = generate_secure_password()
                new_passwords.append((usuario, new_pass))
                
                f.write(f"{usuario:6} | {nombre:20} | {old_pass:18} | {new_pass}\n")
            
            f.write("\n" + "="*60 + "\n")
            f.write("IMPORTANTE:\n")
            f.write("- Las nuevas contraseñas son de 6 dígitos\n")
            f.write("- Deben ser comunicadas de forma segura a cada agente\n")
            f.write("- Los agentes deben cambiarlas en su primer acceso\n")
        
        print(f"   Archivo de nuevas contraseñas: {NEW_PASSWORDS_FILE}")
        
        # 3. Preguntar confirmación antes de actualizar
        print("\n" + "="*60)
        print("ATENCIÓN: Se van a actualizar las contraseñas en la base de datos")
        print(f"Agentes afectados: {len(agents)}")
        print("="*60)
        
        response = input("\n¿Desea proceder con la actualización? (SI/NO): ")
        
        if response.upper() != 'SI':
            print("Operación cancelada por el usuario")
            return
        
        # 4. Actualizar contraseñas en BD
        print("\n3. Actualizando contraseñas en base de datos...")
        
        for usuario, new_pass in new_passwords:
            cursor.execute(
                "UPDATE agentes SET password = %s WHERE usuario = %s",
                (new_pass, usuario)
            )
        
        conn.commit()
        print(f"   ✓ {len(new_passwords)} contraseñas actualizadas exitosamente")
        
        # 5. Crear script de rollback
        rollback_file = f"{OUTPUT_DIR}/../rollback/rollback_agent_passwords.sql"
        with open(rollback_file, 'w') as f:
            f.write("-- Script de rollback para contraseñas de agentes\n")
            f.write(f"-- Generado: {datetime.datetime.now()}\n\n")
            
            for agent in agents:
                usuario, old_pass = agent[0], agent[2]
                f.write(f"UPDATE agentes SET password = '{old_pass}' WHERE usuario = '{usuario}';\n")
        
        print(f"\n4. Script de rollback creado: {rollback_file}")
        
        cursor.close()
        conn.close()
        
        print("\n" + "="*60)
        print("MIGRACIÓN COMPLETADA EXITOSAMENTE")
        print("="*60)
        print(f"1. Backup original: {BACKUP_FILE}")
        print(f"2. Nuevas contraseñas: {NEW_PASSWORDS_FILE}")
        print(f"3. Script rollback: {rollback_file}")
        print("\nSIGUIENTES PASOS:")
        print("- Comunicar nuevas contraseñas a los agentes")
        print("- Monitorear accesos en las próximas horas")
        print("- Verificar que todos puedan acceder")
        
    except Exception as e:
        print(f"ERROR: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()