# variables.py
import sys
import os

# Agrega la ruta absoluta al sys.path
sys.path.append('/var/www/html/config')

from cnxpdo import get_connection

from datetime import datetime
import hashlib

import sys
import os
import re
from dotenv import load_dotenv
from datetime import datetime

# Cargar las variables de entorno desde el archivo .env
#load_dotenv('/var/www/dev.core.ayudacatastro.co/crm/configuraciones/.env')
# Ruta donde se encuentra el archivo .env
#env_file_path = '/var/www/dev.core.ayudacatastro.co/crm/configuraciones/.env'

# Obtener el directorio actual del script
current_dir = os.path.dirname(os.path.abspath(__file__))
# Construimos la ruta al .env en la misma carpeta
env_file_path = os.path.join(current_dir, '.env')
# Cargar las variables de entorno
load_dotenv(env_file_path)
# Opcional para depuración
print(f"Archivo .env cargado desde: {env_file_path}")





def obtener_variables_env():
    """
    Función para obtener las variables del archivo .env.
    Si el archivo no existe, lo crea vacío.
    """
    if not os.path.exists(env_file_path):
        # print(f"El archivo .env no existe. Creando archivo nuevo en: {env_file_path}")
        try:
            # Crear el archivo vacío
            with open(env_file_path, 'w') as f:
                pass  # Solo creamos el archivo vacío
            # print("Archivo .env creado exitosamente.")
        except Exception as e:
            print(f"Error al crear el archivo .env: {e}")
            return {}

    env_variables = {}
    with open(env_file_path, 'r') as f:
        for line in f:
            if '=' in line:
                key, value = line.strip().split('=', 1)
                env_variables[key.strip()] = value.strip().strip('"')

    return env_variables



def obtener_variables_desde_bd():
    """
    Función para obtener las variables de la base de datos.
    Esta función debe utilizar tu lógica de conexión a la base de datos.
    """
    # Suponiendo que ya tienes tu conexión a la base de datos configurada
    conexionBD = get_connection()  # Tu función para obtener la conexión de BD
    if conexionBD is None:
        return {"success": 0, "message": "Error de conexión a la base de datos"}

    try:
        cursor = conexionBD.cursor(dictionary=True)
        query = "SELECT dato, valor FROM cuenta_servicios_datos"
        cursor.execute(query)
        result = cursor.fetchall()

        cursor.close()
        conexionBD.close()

        return result  # Retorna las variables obtenidas de la BD
    except Exception as e:
        print(f"Error al obtener datos de la BD: {e}")
        return {}


def backup_env_file():
    """
    Función para crear un respaldo del archivo .env antes de actualizarlo.
    """
    backup_path = f"{env_file_path}.bak-{datetime.now().strftime('%Y%m%d%H%M%S')}"
    try:
        os.rename(env_file_path, backup_path)
    except Exception as e:
        print(f"Error al crear respaldo: {e}")


def necesita_comillas(valor):
    """
    Función para detectar si un valor necesita comillas.
    Se detectan caracteres especiales como:
    - Espacios en blanco
    - Asteriscos
    - Símbolos como #, %, etc.
    """
    # Si tiene espacios en blanco o caracteres especiales (por ejemplo, %, #, &, etc.)
    if ' ' in valor or '"' in valor or '*' in valor or re.search(r'[^a-zA-Z0-9_/-]', valor):
        return True
    return False

def actualizar_archivo_env(variables_bd):
    """
    Función para actualizar o insertar las variables en el archivo .env con las obtenidas de la base de datos.
    """
    env_variables = obtener_variables_env()  # Obtener las variables actuales del archivo .env
    
    if not env_variables:
        print("Error: No se pudieron obtener las variables del archivo .env")
        return False

    # Hacer un respaldo antes de realizar cambios
    backup_env_file()

    # Recorremos las variables obtenidas desde la base de datos
    for variable in variables_bd:
        dato = variable['dato'].strip()
        valor = variable['valor'].strip()

        # Verificar si el valor necesita comillas
        if necesita_comillas(valor):
            valor = f'"{valor}"'  # Añadimos comillas alrededor del valor si es necesario        
        # Verificar si la variable existe en el archivo .env y actualizar su valor
        if dato in env_variables:
            env_variables[dato] = valor
        else:
            # Si la variable no existe, la agregamos al archivo .env
            env_variables[dato] = valor
            print(f"Insertada nueva variable: {dato} = {valor}")

    print("Contenido actualizado del archivo .env:")

    # Generar el contenido actualizado del archivo .env
    try:
        with open(env_file_path, 'w') as f:
            for key, value in env_variables.items():
                f.write(f"{key}={value}\n")
        return True
    except Exception as e:
        print(f"Error al escribir en el archivo .env: {e}")
        return False





def variables_entorno():
    """
    Función principal que se invoca desde tu aplicación para actualizar el archivo .env.
    Si el archivo .env no existe, lo crea antes de proceder con la actualización.
    """
    # Verificar si el archivo .env existe, si no, crearlo
    if not os.path.exists(env_file_path):
        print(f"El archivo .env no existe. Creando archivo nuevo en: {env_file_path}")
        try:
            # Crear el archivo vacío
            with open(env_file_path, 'w') as f:
                pass  # Solo creamos el archivo vacío
            print("Archivo .env creado exitosamente.")
        except Exception as e:
            print(f"Error al crear el archivo .env: {e}")
            return {"success": 0, "message": f"Error al crear el archivo .env: {e}"}

    # Obtener las variables desde la base de datos
    variables_bd = obtener_variables_desde_bd()

    # Si hubo un error al obtener las variables de la BD
    if not variables_bd:
        print("Error: No se pudieron obtener las variables de la base de datos.")
        return {"success": 0, "message": "Error al obtener las variables de la base de datos"}

    # Intentamos actualizar el archivo .env con las variables obtenidas de la base de datos
    if actualizar_archivo_env(variables_bd):
        return {"success": 1, "message": "Archivo .env actualizado correctamente"}
    else:
        return {"success": 0, "message": "Error al actualizar el archivo .env"}


