# employee.py
import sys
import os
import random


# 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

def listEmpleados():
    conexionBD = get_connection()
    if conexionBD is None:
        return {
            'success': 0,
            'message': 'Error de conexión'
        }

    try:
        # Consulta SQL para obtener los empleados con sus datos relacionados
        query = """
            SELECT e.*, s.status AS nomstatus, u.idperfil
            FROM empleados e
            LEFT JOIN usuarios u ON e.id = u.idEmpleado
            LEFT JOIN status s ON s.id = e.status
        """
        cursor = conexionBD.cursor(dictionary=True)
        cursor.execute(query)
        userData = cursor.fetchall()

        cursor.close()
        conexionBD.close()

        return {
            'success': 1,
            'message': 'Usuarios encontrados',
            'data': userData
        }

    except Exception as e:
        cursor.close()
        conexionBD.close()
        return {
            'success': 0,
            'message': f"Error: {str(e)}"
        }

    conexionBD = get_connection()
    if conexionBD is None:
        return {"success": 0, "message": "Error de conexión"}

    try:
        cursor = conexionBD.cursor(dictionary=True)
        query = "SELECT * FROM empleados WHERE id = %s"
        cursor.execute(query, (id,))
        empleado = cursor.fetchone()

        if empleado:
            cursor.close()
            conexionBD.close()
            return empleado
        else:
            cursor.close()
            conexionBD.close()
            return {"success": 0, "message": "Employee not found"}
    
    except Exception as e:
        conexionBD.close()
        return {"success": 0, "message": f"Error: {str(e)}"}

def insertarEmpleado(data):
    conexionBD = get_connection()
    if conexionBD is None:
        return {"success": 0, "message": "Error de conexión"}

    try:
        cursor = conexionBD.cursor()
        query = """
            INSERT INTO empleados (nombres, apellidos, tipo_doc, documento, id_area, id_cargo, correo_corporativo, 
                                   correo_alterno, telefono, direccion, status)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
        """
        cursor.execute(query, (
            data['nombres'], data['apellidos'], data['tipo_doc'], data['documento'], data['id_area'], data['id_cargo'],
            data['correo_corporativo'], data['correo_alterno'], data['telefono'], data['direccion'], data['status']
        ))
        conexionBD.commit()

        id = cursor.lastrowid

        # Insertar en la tabla de usuarios con un código aleatorio encriptado
        random_code = str(random.randint(100000, 999999))
        randomCodeEncrypted = hashlib.md5(random_code.encode()).hexdigest()

        query2 = """
            INSERT INTO usuarios (idEmpleado, idperfil, passtemp) 
            VALUES (%s, %s, %s)
        """
        cursor.execute(query2, (id, data['idperfil'], randomCodeEncrypted))
        conexionBD.commit()

        data['passtemp'] = random_code
        data['id'] = id

        cursor.close()
        conexionBD.close()

        return {
            "success": 1,
            "message": "Empleado insertado",
            "data": data
        }

    except Exception as e:
        conexionBD.close()
        return {
            "success": 0,
            "message": f"Error: {str(e)}"
        }

def actualizarEmpleado(id, data):
    conexionBD = get_connection()
    if conexionBD is None:
        return {"success": 0, "message": "Error de conexión"}

    try:
        cursor = conexionBD.cursor()

        nomstatus = data['nomstatus']

        # Actualizar la tabla empleados
        query = """
            UPDATE empleados 
            SET nombres = %s, apellidos = %s, tipo_doc = %s, documento = %s, id_cargo = %s, id_area = %s, 
                correo_corporativo = %s, correo_alterno = %s, telefono = %s, direccion = %s, status = %s 
            WHERE id = %s
        """
        cursor.execute(query, (
            data['nombres'], data['apellidos'], data['tipo_doc'], data['documento'], data['id_cargo'], data['id_area'],
            data['correo_corporativo'], data['correo_alterno'], data['telefono'], data['direccion'], data['status'], id
        ))
        conexionBD.commit()

        # Actualizar la tabla usuarios
        query2 = "UPDATE usuarios SET idperfil = %s WHERE idEmpleado = %s"
        cursor.execute(query2, (data['idperfil'], id))
        conexionBD.commit()


        cursor.close()
        conexionBD.close()
        data['id'] = id
        data['nomstatus'] = nomstatus
        
        return {
            "success": 1,
            "message": "Empleado actualizado",
            "data": data
        }

    except Exception as e:
        conexionBD.close()
        return {
            "success": 0,
            "message": f"Error: {str(e)}"
        }

def eliminarEmpleado(id):
    conexionBD = get_connection()
    if conexionBD is None:
        return {"success": 0, "message": "Error de conexión"}

    try:
        cursor = conexionBD.cursor()

        # Eliminar empleado
        query = "DELETE FROM empleados WHERE id = %s"
        cursor.execute(query, (id,))
        conexionBD.commit()

        cursor.close()
        conexionBD.close()

        if cursor.rowcount > 0:
            return {"success": 1, "message": "Employee deleted"}
        else:
            return {"success": 0, "message": "Failed to delete employee"}

    except Exception as e:
        conexionBD.close()
        return {"success": 0, "message": f"Error: {str(e)}"}



def list_complete_user_data():
    conexionBD = get_connection()
    if conexionBD is None:
        return {
            'success': False,
            'message': 'Error de conexión'
        }

    try:
        # Consulta SQL para obtener los empleados con sus datos relacionados
        query = """
            SELECT 
                e.id,
                e.nombres,
                e.apellidos,
                e.tipo_doc,
                e.documento,
                ea.area,
                ec.cargo,
                e.correo_corporativo,
                e.correo_alterno,
                e.telefono,
                e.direccion,
                s.status AS nomstatus,
                ep.perfiles AS perfil
            FROM empleados e
            LEFT JOIN empleados_areas ea ON e.id_area = ea.id
            LEFT JOIN empleados_cargos ec ON e.id_cargo = ec.id
            LEFT JOIN status s ON e.status = s.id
            LEFT JOIN usuarios u ON e.id = u.idEmpleado
            LEFT JOIN empleados_perfiles ep ON u.idperfil = ep.id
        """
        
        cursor = conexionBD.cursor(dictionary=True)
        cursor.execute(query)
        userData = cursor.fetchall()

        cursor.close()
        conexionBD.close()

        return {
            'success': True,
            'message': 'Lista completa de usuarios encontrados',
            'data': userData
        }

    except Exception as e:
        cursor.close()
        conexionBD.close()
        return {
            'success': False,
            'message': f"Error: {str(e)}"
        }