from flask import Flask, request, jsonify
from flask_cors import CORS
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import threading
import time
from PIL import Image
from io import BytesIO
import requests
import subprocess
import sys

app = Flask(__name__)

# # Permitir solo el dominio api2.educacionweb.es
# CORS(app)



# Obtener el puerto y el perfil de usuario desde los argumentos de la línea de comandos
if len(sys.argv) != 3:
    print("Uso: python script.py <puerto> <ruta_perfil>")
    sys.exit(1)

port = int(sys.argv[1])
profile_path = sys.argv[2]

# Configurar opciones de Chrome para usar un perfil de usuario específico
options = webdriver.ChromeOptions()
options.add_argument(f'--user-data-dir={profile_path}')  # Ruta específica a tu perfil de Chrome
options.add_argument('--profile-directory=Default')  # Perfil por defecto

# Inicializar el controlador de Chrome con las opciones configuradas
driver = webdriver.Chrome(options=options)
driver.get("https://web.whatsapp.com")

# Esperar hasta que se cargue la lista de chats
WebDriverWait(driver, 120).until(
    EC.presence_of_element_located((By.XPATH, "//*[@id='side']/div[1]/div/div[2]/div[2]/div/div[1]"))
)

def download_image(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    response = requests.get(url, headers=headers)
    response.raise_for_status()  # Lanza un error si la solicitud falla
    return response.content

def image_to_clipboard(image_data):
    image = Image.open(BytesIO(image_data))
    output = BytesIO()
    image.save(output, format="PNG")
    data = output.getvalue()

    # Copiar al portapapeles usando xclip
    process = subprocess.Popen(['xclip', '-selection', 'clipboard', '-t', 'image/png'], stdin=subprocess.PIPE)
    process.communicate(input=data)

def copiar_al_portapapeles(texto):
    proceso = subprocess.Popen(['xclip', '-selection', 'clipboard'], stdin=subprocess.PIPE)
    proceso.communicate(input=texto.encode('utf-8'))

# La clave API para la autenticación
API_KEY = 'aBcD1234EfGh5678IjKlMnOpQrStUvWxYz'

@app.before_request
def before_request():

    # Verificar si la clave API está presente y es correcta
    token = request.headers.get('x-api-key')
    if token != API_KEY:
        return jsonify({"error": "Unauthorized access"}), 401

@app.route('/send-message', methods=['POST'])
def send_message():
    contact_name = request.form.get('contact_name', '')
    message = request.form.get('message', '')
    image_url = request.form.get('image_url', '')  # URL de imagen si se proporciona
    image_file = request.files.get('image', None)  # Archivo de imagen si se proporciona

    if not contact_name:
        return jsonify({"error": "No contact name provided"}), 400

    if not message and not (image_url or image_file):
        return jsonify({"error": "No message or image provided"}), 400

    try:
        print("Buscando el campo de búsqueda...")
        search_box = WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.XPATH, "//*[@id='side']/div[1]/div/div[2]/div[2]/div/div[1]"))
        )
        search_box.click()

        print("Asegurando que el campo de búsqueda esté vacío...")
        search_box.send_keys(Keys.CONTROL + "a")
        search_box.send_keys(Keys.BACKSPACE)

        print("Esperando que el campo de búsqueda sea clicable...")
        WebDriverWait(driver, 20).until(
            EC.element_to_be_clickable((By.XPATH, "//*[@id='side']/div[1]/div/div[2]/div[2]/div/div[1]"))
        )

        print(f"Escribiendo el nombre del contacto: {contact_name}")
        search_box.send_keys(contact_name)
        search_box.send_keys(Keys.RETURN)

        print("Buscando el cuadro de texto para escribir el mensaje...")
        message_box = WebDriverWait(driver, 20).until(
            EC.element_to_be_clickable((By.XPATH, "//*[@id='main']/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[1]"))
        )

        if message:
            print(f"Escribiendo el mensaje: {message}")
            for line in message.split('\n'):
                # message_box.send_keys(line)
                copiar_al_portapapeles(line)
                message_box.send_keys(Keys.CONTROL + "v")
                message_box.send_keys(Keys.SHIFT, Keys.RETURN)  # Agrega un salto de línea

        if image_url:
            if image_url.startswith('http'):
                print(f"Descargando la imagen desde {image_url}")
                image_data = download_image(image_url)
            else:
                print(f"Leyendo la imagen desde la ruta local {image_url}")
                with open(image_url, 'rb') as f:
                    image_data = f.read()
            image_to_clipboard(image_data)
            print("Pegando la imagen desde el portapapeles")
            time.sleep(2)
            message_box.send_keys(Keys.CONTROL + "v")

        if image_file:
            print("Leyendo el archivo de imagen subido")
            image_data = image_file.read()
            image_to_clipboard(image_data)
            print("Pegando la imagen desde el portapapeles")
            time.sleep(2)
            message_box.send_keys(Keys.CONTROL + "v")

        print("Esperando que el botón de enviar sea clicable...")
        if image_url or image_file:
            send_button_xpath = "//*[@id='app']/div/div[2]/div[2]/div[2]/span/div/div/div/div[2]/div/div[2]/div[2]/div/div"
        else:
            send_button_xpath = "//*[@id='main']/footer/div[1]/div/span[2]/div/div[2]/div[2]/button/span"

        send_button = WebDriverWait(driver, 20).until(
            EC.element_to_be_clickable((By.XPATH, send_button_xpath))
        )
        time.sleep(1)
        send_button.click()

        return jsonify({"status": "Message sent successfully"}), 200

    except Exception as e:
        print(f"Se produjo un error: {str(e)}")
        return jsonify({"error": f"An error occurred: {str(e)}"}), 500

@app.route('/send-message-to-number', methods=['POST'])
def send_message_to_number():
    phone_number = request.form.get('phone_number', '')
    message = request.form.get('message', '')
    image_url = request.form.get('image_url', '')  # URL de imagen si se proporciona
    image_file = request.files.get('image', None)  # Archivo de imagen si se proporciona

    if not phone_number:
        return jsonify({"error": "No phone number provided"}), 400

    if not message and not (image_url or image_file):
        return jsonify({"error": "No message or image provided"}), 400

    try:
        # Reemplazar los saltos de línea en el mensaje con %0A y espacios con %20
        text = message.replace('\n', '%0A').replace(' ', '%20')  
        url = f"https://web.whatsapp.com/send?phone={phone_number}&text={text}"
        driver.get(url)

        if image_url or image_file:
            if image_url:
                if image_url.startswith('http'):
                    print(f"Descargando la imagen desde {image_url}")
                    image_data = download_image(image_url)
                else:
                    print(f"Leyendo la imagen desde la ruta local {image_url}")
                    with open(image_url, 'rb') as f:
                        image_data = f.read()
            elif image_file:
                print("Leyendo el archivo de imagen subido")
                image_data = image_file.read()

            image_to_clipboard(image_data)
            print("Pegando la imagen desde el portapapeles")
            time.sleep(2)
            message_box = WebDriverWait(driver, 20).until(
                EC.element_to_be_clickable((By.XPATH, "//*[@id='main']/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[1]"))
            )
            message_box.send_keys(Keys.CONTROL + "v")

        print("Esperando que el botón de enviar sea clicable...")
        send_button_xpath = "//*[@id='app']/div/div[2]/div[2]/div[2]/span/div/div/div/div[2]/div/div[2]/div[2]/div/div" if (image_url or image_file) else "//*[@id='main']/footer/div[1]/div/span[2]/div/div[2]/div[2]/button/span"
        send_button = WebDriverWait(driver, 20).until(
            EC.element_to_be_clickable((By.XPATH, send_button_xpath))
        )
        time.sleep(1)
        send_button.click()

        return jsonify({"status": "Message sent successfully"}), 200

    except Exception as e:
        print(f"Se produjo un error: {str(e)}")
        return jsonify({"error": f"An error occurred: {str(e)}"}), 500


if __name__ == '__main__':
    threading.Thread(target=lambda: app.run(port=port, debug=False, use_reloader=False)).start()
