"""
Para sacar las coordenadas exactas de tu input, usa este mini script:

import pyautogui
import time

print("Mueve el mouse al lugar deseado. Se imprimirá la posición cada segundo.")

while True:
    print(pyautogui.position())
    time.sleep(1)
"""
import time
import random
import pyautogui
import pyperclip
from dataclasses import dataclass
import platform

# Seguridad básica de PyAutoGUI:
# Si mueves el mouse a la esquina superior izquierda, el script se detiene.
pyautogui.FAILSAFE = True
pyautogui.PAUSE = 0.15


@dataclass
class ArticleTask:
    title:str
    url:str
    extra_instruction:str = ""


def human_sleep(min_s = 0.4, max_s = 1.4):
    """Pausa aleatoria para simular tiempos humanos."""
    time.sleep(random.uniform(min_s, max_s))


def human_move_to(x:int, y:int, min_duration = 0.25, max_duration = 0.9):
    """Mueve el mouse con duración variable."""
    pyautogui.moveTo(
        x,
        y,
        duration=random.uniform(min_duration, max_duration),
        tween=pyautogui.easeInOutQuad
    )


def human_click(x:int, y:int, clicks = 1):
    """Mueve y hace click con pequeñas pausas."""
    human_move_to(x + random.randint(-3, 3), y + random.randint(-3, 3))
    human_sleep(0.1, 0.35)
    pyautogui.click(clicks=clicks, interval=random.uniform(0.08, 0.18))
    human_sleep(0.3, 0.9)

def click_random_input_area():
    """
    Hace click dentro del input y fuerza foco antes de escribir/pegar.
    """

    possible_points = [
        (726, 942),
        (745, 924),
        (709, 873),
    ]

    x, y = random.choice(possible_points)

    x += random.randint(-6, 6)
    y += random.randint(-6, 6)

    # Mover al input
    human_move_to(
        x,
        y,
        min_duration=0.45,
        max_duration=1.2,
    )

    human_sleep(0.4, 1.0)

    # Primer click
    pyautogui.click(x, y)
    human_sleep(0.4, 0.9)

    # Segundo click suave para asegurar foco
    pyautogui.click(x + random.randint(-2, 2), y + random.randint(-2, 2))
    human_sleep(0.5, 1.1)

    return x, y    
    
def paste_text(text:str):
    """
    Pega texto en el campo actualmente enfocado.
    Usa Ctrl+V en Windows/Linux y Command+V en Mac.
    """
    pyperclip.copy(text)
    human_sleep(0.3, 0.8)

    if platform.system() == "Darwin":  # Mac
        pyautogui.hotkey("command", "v")
    else:# Windows/Linux
        pyautogui.hotkey("ctrl", "v")

    human_sleep(0.5, 1.2)

def human_type_short(text:str):
    """
    Escribe texto corto con variación humana.
    Para textos largos conviene usar paste_text().
    """
    for char in text:
        pyautogui.write(char)
        time.sleep(random.uniform(0.025, 0.12))


def build_summary_prompt(article:ArticleTask) -> str:
    base_prompt = f"""
Lee los siguiente artículos y hazme un resumen claro, ejecutivo y útil.

Título:
{article.title}

URL:
{article.url}

Quiero que me devuelvas:
1. Resumen en 5 bullets.
2. Idea principal.
3. Puntos importantes.
4. Posible impacto para negocios/finanzas/tecnología.
5. Si hay datos, cifras o fechas relevantes, inclúyelas.
6. Dame una conclusión breve.

Instrucción extra:
{article.extra_instruction or "Sin instrucción extra."}
""".strip()

    return base_prompt


def ask_system_to_summarize_article(
    article:ArticleTask,
    input_box_x:int,
    input_box_y:int,
    send_button_x:int | None = None,
    send_button_y:int | None = None,
    press_enter_to_send:bool = True,
):
    """
    Hace click en el input del sistema, pega el prompt y lo envía.
    """

    prompt = build_summary_prompt(article)

    print(f"Procesando artículo: {article.title}")

    # Click random dentro de la zona del input
    x, y = click_random_input_area()

    # Limpiar input anterior
    if platform.system() == "Darwin":  # Mac
        pyautogui.hotkey("command", "a")
    else:
        pyautogui.hotkey("ctrl", "a")

    human_sleep(0.2, 0.5)
    pyautogui.press("backspace")
    human_sleep(0.4, 0.9)

    # Volver a clickear antes de pegar, para asegurar que el foco siga en el input
    pyautogui.click(x, y)
    human_sleep(0.3, 0.8)

    # Pegar prompt
    paste_text(prompt)
    human_sleep(0.8, 2.0)

    # Enviar
    if press_enter_to_send:
        pyautogui.press("enter")
    else:
        if send_button_x is None or send_button_y is None:
            raise ValueError("Debes pasar coordenadas del botón de enviar.")
        human_click(send_button_x, send_button_y)

    human_sleep(3.0, 6.0)


def main():
    """
    Antes de correr:
    1. Abre tu sistema en el navegador.
    2. Deja visible la caja donde escribes el prompt.
    3. Ajusta las coordenadas input_box_x/input_box_y.
    4. Ejecuta el script.
    """

    # Coordenadas de ejemplo. Debes cambiarlas según tu pantalla.
    INPUT_BOX_X = 650
    INPUT_BOX_Y = 850

    # Si tu sistema no envía con Enter, pon press_enter_to_send=False
    # y configura SEND_BUTTON_X / SEND_BUTTON_Y.
    SEND_BUTTON_X = 1180
    SEND_BUTTON_Y = 850

    articles = [
        ArticleTask(
            title="Reservas récord en Argentina: ¿qué dicen sobre la economía?",
            url="https://p.dw.com/p/5EYii",
            extra_instruction="Analiza también si la noticia es realmente positiva o si tiene riesgos ocultos."
        ),
        ArticleTask(
            title="Ejemplo de otro artículo",
            url="https://example.com/articulo-2",
            extra_instruction="Dame un resumen orientado a toma de decisiones."
        ),
    ]

    print("Tienes 5 segundos para poner el navegador en primer plano...")
    time.sleep(5)

    for article in articles:
        ask_system_to_summarize_article(
            article=article,
            input_box_x=INPUT_BOX_X,
            input_box_y=INPUT_BOX_Y,
            send_button_x=SEND_BUTTON_X,
            send_button_y=SEND_BUTTON_Y,
            press_enter_to_send=True,
        )

        # Pausa entre artículos
        human_sleep(6, 12)


if __name__ == "__main__":
    main()