"""
Generador de prompt para adaptación de IO - Este script genera un prompt para ayudar con la
adaptación de IO entre hardware de PLC Siemens TIA Portal y software master.
"""

# Standard library imports
import os
import sys
import tkinter as tk
from tkinter import filedialog
import pyperclip  # Para copiar al portapapeles
import shutil  # Para copiar archivos
import subprocess  # Para abrir Cursor

# Determine script_root and add to sys.path for custom module import
try:
    current_script_path = os.path.abspath(__file__)
    script_root = os.path.dirname(
        os.path.dirname(os.path.dirname(os.path.dirname(current_script_path)))
    )
    if script_root not in sys.path:
        sys.path.append(script_root)

    from backend.script_utils import load_configuration

except ImportError:
    print(
        "Error: No se pudo importar 'load_configuration' desde 'backend.script_utils'."
    )
    sys.exit(1)
except NameError:  # __file__ is not defined
    print(
        "Error: __file__ no está definido. Este script podría no estar ejecutándose en un entorno Python estándar."
    )
    sys.exit(1)


def verify_path(path, is_file=True):
    """Verifica si una ruta existe y es un archivo o directorio según corresponda."""
    if is_file:
        return os.path.isfile(path)
    else:
        return os.path.isdir(path)


def select_obsidian_folder():
    """Permite al usuario seleccionar la carpeta base de Obsidian."""
    root = tk.Tk()
    root.withdraw()  # Ocultar ventana principal

    folder_path = filedialog.askdirectory(
        title="Seleccione la carpeta base de Obsidian", mustexist=True
    )

    return folder_path if folder_path else None


def copy_obsidian_files_to_working_dir(obsidian_mixer_path, data_directory):
    """
    Copia los archivos de Obsidian al directorio de trabajo.
    Retorna un diccionario con las rutas de los archivos copiados.
    """
    copied_files = {}

    # Archivos a copiar desde Obsidian
    obsidian_files = ["SIDEL - Mixer - Equivalences.md", "Default IO for Analog.md"]

    for filename in obsidian_files:
        source_path = os.path.join(obsidian_mixer_path, filename)
        dest_path = os.path.join(data_directory, filename)

        if os.path.isfile(source_path):
            try:
                shutil.copy2(source_path, dest_path)
                print(f"Archivo copiado: {filename}")
                copied_files[filename] = dest_path
            except Exception as e:
                print(f"Error al copiar {filename}: {e}")
        else:
            print(f"Archivo no encontrado en Obsidian: {filename}")

    return copied_files


def copy_twincat_files_to_working_dir(twincat_project_path, data_directory):
    """
    Copia todos los archivos *.md desde el directorio de proyecto TwinCat al directorio de trabajo.
    Retorna un diccionario con las rutas de los archivos copiados.
    """
    copied_files = {}

    if not os.path.isdir(twincat_project_path):
        print(f"Directorio de proyecto TwinCat no encontrado: {twincat_project_path}")
        return copied_files

    # Buscar todos los archivos *.md en el directorio
    import glob

    md_files = glob.glob(os.path.join(twincat_project_path, "*.md"))

    for md_file in md_files:
        filename = os.path.basename(md_file)
        dest_path = os.path.join(data_directory, filename)

        try:
            shutil.copy2(md_file, dest_path)
            print(f"Archivo TwinCat copiado: {filename}")
            copied_files[filename] = dest_path
        except Exception as e:
            print(f"Error al copiar {filename}: {e}")

    return copied_files


def open_cursor_in_directory(directory_path):
    """Abre Cursor en el directorio especificado."""
    try:
        # Rutas comunes donde se instala Cursor
        possible_cursor_paths = [
            r"C:\Users\migue\AppData\Local\Programs\cursor\Cursor.exe",
            r"C:\Program Files\Cursor\Cursor.exe",
            r"C:\Program Files (x86)\Cursor\Cursor.exe",
        ]
        editor_path = None
        for path in possible_cursor_paths:
            if os.path.isfile(path):
                editor_path = path
                break

        if not editor_path:
            # Intentar buscar en PATH
            editor_path = shutil.which("cursor")

        if not editor_path:
            print(
                f"Cursor no encontrado. Intenté en: {', '.join(possible_cursor_paths)}"
            )
            return False

        print(f"Launching Cursor from: {editor_path}")
        print(f"Opening directory: {directory_path}")

        # Ejecutar Cursor
        process = subprocess.Popen(f'"{editor_path}" "{directory_path}"', shell=True)
        print(f"Cursor process started with PID: {process.pid}")
        return True
    except Exception as e:
        print(f"Error al abrir Cursor: {e}")
        return False


def generate_prompt():
    """
    Genera el prompt para la adaptación de IO y lo copia al portapapeles.
    Verifica la existencia de archivos y directorios.
    """
    # Cargar la configuración para obtener working_directory
    try:
        configs = load_configuration()
        working_directory = configs.get("working_directory")
        if not working_directory:
            print("Error: 'working_directory' no se encontró en la configuración.")
            return False
        if not os.path.isdir(working_directory):
            print(
                f"Error: El directorio de trabajo '{working_directory}' no existe o no es un directorio."
            )
            return False

        group_config = configs.get("level2", {})
        resultados_exp_directory = group_config.get("resultados_exp_directory")
        if not resultados_exp_directory:
            print(
                "Error: 'resultados_exp_directory' no se encontró en la configuración de nivel 2."
            )
            return False
    except Exception as e:
        print(f"Error al cargar la configuración: {e}")
        return False

    working_directory_abs = os.path.abspath(working_directory)
    print(f"Usando directorio de trabajo: {working_directory_abs}")

    # Definir el directorio de datos
    data_directory = os.path.join(working_directory_abs, resultados_exp_directory)

    # Variables para las rutas de Obsidian
    obsidian_mixer_path = None

    # Intentar obtener la carpeta base de Obsidian desde la configuración
    copied_files = {}
    obsidian_mixer_path = None
    twincat_project_path = None

    try:
        # Obtener configuración del nivel 3
        group_config = configs.get("level3", {})
        conversion_desde = group_config.get("conversion_desde")

        # Verificar si es TwinCat
        if conversion_desde == "TwinCat":
            print("Detectado proyecto TwinCat")
            results_twincat_project = group_config.get("results_twincat_project")
            if results_twincat_project:
                twincat_project_path = os.path.abspath(results_twincat_project)
                if os.path.isdir(twincat_project_path):
                    print(
                        f"Usando directorio de proyecto TwinCat: {twincat_project_path}"
                    )
                    # Copiar archivos TwinCat
                    print("Copiando archivos TwinCat al directorio de trabajo...")
                    copied_files = copy_twincat_files_to_working_dir(
                        twincat_project_path, data_directory
                    )
                else:
                    print(
                        f"Directorio de proyecto TwinCat no válido: {twincat_project_path}"
                    )
            else:
                print(
                    "Configuración incompleta para TwinCat: falta 'results_twincat_project'"
                )
        else:
            # Configuración para Obsidian (comportamiento original)
            obsidian_dir = group_config.get("ObsideanDir")
            obsidian_projects_base = group_config.get("ObsideanProjectsBase")

            if obsidian_dir and obsidian_projects_base:
                # Path para la carpeta de equivalencias (00 - MASTER/MIXER/IO)
                obsidian_mixer_path = os.path.join(
                    obsidian_dir,
                    obsidian_projects_base.lstrip("\\"),
                    "00 - MASTER",
                    "MIXER",
                    "IO",
                )

                # Verificar que la ruta de equivalencias exista
                if os.path.isdir(obsidian_mixer_path):
                    print(
                        f"Usando ruta de Obsidian desde configuración: {obsidian_mixer_path}"
                    )
                else:
                    print(
                        f"Ruta de Obsidian para equivalencias no válida: {obsidian_mixer_path}"
                    )
                    obsidian_mixer_path = None
            else:
                print("Configuración incompleta para las rutas de Obsidian")
    except Exception as e:
        print(f"Error al leer configuración: {e}")

    # Si es TwinCat y no se pudo obtener la configuración, salir
    if conversion_desde == "TwinCat" and not twincat_project_path:
        print("No se pudo obtener la configuración de TwinCat. Saliendo...")
        return False

    # Si no es TwinCat y no se pudo obtener la carpeta de Obsidian, pedirla al usuario
    if conversion_desde != "TwinCat" and not obsidian_mixer_path:
        print(
            "Carpeta de equivalencias en Obsidian no encontrada en configuración o no válida."
        )
        print(
            "Por favor, seleccione la carpeta base de Obsidian para los archivos de equivalencias..."
        )
        obsidian_mixer_path = select_obsidian_folder()

        if not obsidian_mixer_path:
            print("No se seleccionó ninguna carpeta. Saliendo...")
            return False

        print(f"Usando carpeta de equivalencias en Obsidian: {obsidian_mixer_path}")

        # Copiar archivos de Obsidian al directorio de trabajo
        print("Copiando archivos de Obsidian al directorio de trabajo...")
        copied_files = copy_obsidian_files_to_working_dir(
            obsidian_mixer_path, data_directory
        )

    # Definir las rutas a los archivos (todos en el mismo directorio)
    master_table_path = os.path.join(data_directory, "Master IO Tags.md")
    hardware_table_path = os.path.join(data_directory, "Hardware.md")
    adaptation_table_path = os.path.join(data_directory, "IO Adapted.md")

    # Verificar que los archivos existan
    files_to_check = [
        {"path": master_table_path, "name": "Master IO Tags.md", "required": True},
        {"path": hardware_table_path, "name": "Hardware.md", "required": True},
    ]

    # Agregar archivos copiados según el tipo de conversión
    if conversion_desde == "TwinCat":
        # Para TwinCat, agregar todos los archivos *.md copiados
        for filename in copied_files.keys():
            file_path = os.path.join(data_directory, filename)
            files_to_check.append(
                {"path": file_path, "name": filename, "required": False}
            )
    else:
        # Para Obsidian, agregar archivos específicos
        for filename in ["SIDEL - Mixer - Equivalences.md", "Default IO for Analog.md"]:
            file_path = os.path.join(data_directory, filename)
            files_to_check.append(
                {"path": file_path, "name": filename, "required": False}
            )

    missing_files = []
    for file_info in files_to_check:
        if not verify_path(file_info["path"]):
            if file_info["required"]:
                missing_files.append(f"[REQUERIDO] {file_info['name']}")
            else:
                missing_files.append(f"[OPCIONAL] {file_info['name']}")

    if missing_files:
        print("Los siguientes archivos no se encontraron:")
        for missing_file in missing_files:
            print(f"  - {missing_file}")

        # Si faltan archivos requeridos, mostrar advertencia pero continuar
        if any(f.startswith("[REQUERIDO]") for f in missing_files):
            print(
                "ADVERTENCIA: Faltan archivos requeridos. Continuando de todos modos..."
            )

    # Generar el texto del prompt usando el sistema de Cursor con @archivo.md
    if conversion_desde == "TwinCat":
        # Prompt para TwinCat
        prompt_text = f"""
Estoy adaptando las entradas y salidas entre un hardware de PLC TwinCat y un software master. Para lograr identificar que tags del software master se deben asignar a cada IO del hardware del PLC. Se debe asignar a cada IO del harware un Tag del software master. 
Para que me ayudes con este proceso de busqueda he creado las tablas:

@Master IO Tags.md: que contiene los tags del software master con las descripciones. Esta tabla se divide en 4 subtablas. La "Inputs PLCTags" son los inputs mas utilizados, luego estan los "InputsMaster PLCTags" que son inputs menos utilizados. Lo mismo sucede con "Outputs PLCTags" que son los mas utilizados y "OutputsMaster PLCTags" son los outputs menos utilizados. 

@Hardware.md: que contiene todo el IO del hardware del PLC. Esta dibidido en diferentes dispositivos ya que algunos componentes se acceden mediante interfaces de comunicaciones como profibus. Pero desde el punto de vista del PLC son inputs o outputs definidos como PEW que significa: P:periferia, W:word , se sigue la nomenclatura alemana de siemens, A:output, E:input. 

@IO Adapted.md: es la tabla que deseo que crees con los IO adaptados. Seria la @Hardware.md con los tags de la @Master IO Tags.md. Quisiera que se agrege una columna con el nivel de certeza y en caso que el nivel no sea el maximo quisiera que agregues 3 posibles opciones como tag1,tag2,tag3 en una columna nueva.

Para acceder a los archivos para leer o escribir puedes usar el MCP filesystem. 

# CONTEXTO DEL PROYECTO
Estoy realizando un upgrade de software para equipos que migran de un sistema TwinCat a uno nuevo. Estos equipos tienen hardware de PLC TwinCat que debe ser adaptado al software master moderno. La correcta asignación de entradas/salidas es fundamental para que el sistema funcione adecuadamente.

# OBJETIVO
Crear una tabla de adaptación que asigne correctamente cada entrada/salida (I/O) del hardware de PLC TwinCat a los tags correspondientes del software master moderno. Este mapeo permitirá la comunicación efectiva entre el hardware existente y el nuevo software de control.

# TECNOLOGÍA Y NOMENCLATURA
- Sistema de control: TwinCat PLC
- Nomenclatura TwinCat:
  * E: Entrada (Input) - Ejemplo: I0.1, EW100
  * A: Salida (Output) - Ejemplo: Q0.1, AW100
  * P: Periferia
  * W: Word (16 bits)
  * D: Double Word (32 bits)

# DESCRIPCIÓN DE LOS ARCHIVOS

## Hardware_table (@Hardware.md)
- FUNCIÓN: Contiene la configuración completa del hardware del PLC y el detalle de todas las señales de I/O físicas.
- ESTRUCTURA: 
  * Primera sección: Tabla de configuración del PLC con red, direcciones y dispositivos
  * Segunda sección: Tabla de I/O con dirección (ej. I0.1, PEW100), descripción y sensor asociado
- INFORMACIÓN CLAVE: Direcciones de hardware, descripciones físicas y conexiones de sensores/actuadores

## Master_table (@Master IO Tags.md)
- FUNCIÓN: Define los tags estandarizados en el software master moderno que deben mapearse a las I/O físicas.
- ESTRUCTURA: Dividido en 4 secciones:
  * "Inputs PLCTags": Entradas más utilizadas
  * "InputsMaster PLCTags": Entradas secundarias
  * "Outputs PLCTags": Salidas más utilizadas
  * "OutputsMaster PLCTags": Salidas secundarias
- INFORMACIÓN CLAVE: Tags estandarizados, tipos de datos y descripciones en inglés

## Adaptation_table (a crear en @IO Adapted.md)
- FUNCIÓN: Tabla final que mapea cada I/O del hardware a su correspondiente tag del master.
- ESTRUCTURA: Formato requerido:
  | IO | Master Tag | PLC Description | Master Description | Certeza | Alternative |
- INFORMACIÓN CLAVE: Resultado del proceso de adaptación con nivel de confianza y alternativas

# PROCESO DE ADAPTACIÓN
Lee ambos archivos (@Hardware.md y @Master IO Tags.md) y crea una tabla de adaptación que asigne a cada IO del hardware un Tag del software master.

El proceso de asignación debe:
1. Comparar semánticamente descripciones entre ambas tablas
2. Verificar compatibilidad de tipo (input/output) y tamaño de datos
3. Priorizar los tags de las tablas principales ("Inputs PLCTags"/"Outputs PLCTags") sobre las secundarias

# FORMATO DE SALIDA
Crea la tabla con esta estructura exacta:
| IO | Master Tag | PLC Description | Master Description | Certeza | Alternative |

# NIVELES DE CERTEZA
Asigna niveles de certeza según estos criterios:
- Alto (90%+): Coincidencia evidente en nombre y descripción
- Medio (70-90%): Similitud semántica notable pero no exacta
- Bajo (<70%): Similitud limitada, requiere revisión manual

Para entradas con nivel de certeza medio o bajo, añade hasta 3 tags alternativos en la columna "Alternative" separados por comas.

# EXCEPCIONES
Al final del documento, crea una sección titulada "## Excepciones y Problemas" con una tabla que liste las IO sin asignación clara y el problema detectado.
"""
    else:
        # Prompt para Obsidian (comportamiento original)
        prompt_text = f"""
Estoy adaptando las entradas y salidas entre un hardware de PLC Siemens Tia Portal y un software master. Para lograr identificar que tags del software master se deben asignar a cada IO del hardware del PLC. Se debe asignar a cada IO del harware un Tag del software master. 
Para que me ayudes con este proceso de busqueda he creado las tablas:

@Master IO Tags.md: que contiene los tags del software master con las descripciones. Esta tabla se divide en 4 subtablas. La "Inputs PLCTags" son los inputs mas utilizados, luego estan los "InputsMaster PLCTags" que son inputs menos utilizados. Lo mismo sucede con "Outputs PLCTags" que son los mas utilizados y "OutputsMaster PLCTags" son los outputs menos utilizados. 

@Hardware.md: que contiene todo el IO del hardware del PLC. Esta dibidido en diferentes dispositivos ya que algunos componentes se acceden mediante interfaces de comunicaciones como profibus. Pero desde el punto de vista del PLC son inputs o outputs definidos como PEW que significa: P:periferia, W:word , se sigue la nomenclatura alemana de siemens, A:output, E:input. 

@IO Adapted.md: es la tabla que deseo que crees con los IO adaptados. Seria la @Hardware.md con los tags de la @Master IO Tags.md. Quisiera que se agrege una columna con el nivel de certeza y en caso que el nivel no sea el maximo quisiera que agregues 3 posibles opciones como tag1,tag2,tag3 en una columna nueva.

@SIDEL - Mixer - Equivalences.md tiene información de ciertas equivalencias que pueden ser útiles para las búsquedas. 
@Default IO for Analog.md tiene conexiones estandard en los casos mas comunes.

Para acceder a los archivos para leer o escribir puedes usar el MCP filesystem. 

# CONTEXTO DEL PROYECTO
Estoy realizando un upgrade de software para equipos SIDEL que migran de un sistema antiguo a uno nuevo. Estos equipos de mezclado de bebidas (mixers) tienen hardware de PLC Siemens que debe ser adaptado al software master moderno. La correcta asignación de entradas/salidas es fundamental para que el sistema funcione adecuadamente.

# OBJETIVO
Crear una tabla de adaptación que asigne correctamente cada entrada/salida (I/O) del hardware de PLC Siemens TIA Portal a los tags correspondientes del software master moderno. Este mapeo permitirá la comunicación efectiva entre el hardware existente y el nuevo software de control.

# TECNOLOGÍA Y NOMENCLATURA
- Sistema de control: Siemens PLC con TIA Portal
- Nomenclatura Siemens (alemana):
  * E: Entrada (Input) - Ejemplo: I0.1, EW100
  * A: Salida (Output) - Ejemplo: Q0.1, AW100
  * P: Periferia
  * W: Word (16 bits)
  * D: Double Word (32 bits)
- PEW: Entrada de Periferia Word (Peripheral Input Word)
- PAW: Salida de Periferia Word (Peripheral Output Word)

# DESCRIPCIÓN DE LOS ARCHIVOS

## Hardware_table (@Hardware.md)
- FUNCIÓN: Contiene la configuración completa del hardware del PLC y el detalle de todas las señales de I/O físicas.
- ESTRUCTURA: 
  * Primera sección: Tabla de configuración del PLC con red, direcciones y dispositivos
  * Segunda sección: Tabla de I/O con dirección (ej. I0.1, PEW100), descripción en italiano/inglés y sensor asociado
- INFORMACIÓN CLAVE: Direcciones de hardware, descripciones físicas y conexiones de sensores/actuadores

## Master_table (@Master IO Tags.md)
- FUNCIÓN: Define los tags estandarizados en el software master moderno que deben mapearse a las I/O físicas.
- ESTRUCTURA: Dividido en 4 secciones:
  * "Inputs PLCTags": Entradas más utilizadas
  * "InputsMaster PLCTags": Entradas secundarias
  * "Outputs PLCTags": Salidas más utilizadas
  * "OutputsMaster PLCTags": Salidas secundarias
- INFORMACIÓN CLAVE: Tags estandarizados, tipos de datos y descripciones en inglés

## Equivalences_data (@SIDEL - Mixer - Equivalences.md)
- FUNCIÓN: Proporciona equivalencias semánticas entre terminologías antiguas/nuevas y abreviaturas.
- ESTRUCTURA: Listado de equivalencias como "301 : WATER PUMP = P1"
- INFORMACIÓN CLAVE: Traducciones entre nomenclaturas, equivalencias entre códigos y nombres descriptivos

## DefaultIO_data (@Default IO for Analog.md)
- FUNCIÓN: Contiene configuraciones predeterminadas para señales analógicas específicas.
- ESTRUCTURA: Tabla con tags, tipos de datos y direcciones de memoria para señales analógicas estándar
- INFORMACIÓN CLAVE: Mapeos predefinidos para señales analógicas comunes, especialmente para comunicación Profibus

## Adaptation_table (a crear en @IO Adapted.md)
- FUNCIÓN: Tabla final que mapea cada I/O del hardware a su correspondiente tag del master.
- ESTRUCTURA: Formato requerido:
  | IO | Master Tag | PLC Description | Master Description | Certeza | Alternative |
- INFORMACIÓN CLAVE: Resultado del proceso de adaptación con nivel de confianza y alternativas

# PROCESO DE ADAPTACIÓN
Lee ambos archivos (@Hardware.md y @Master IO Tags.md) y crea una tabla de adaptación que asigne a cada IO del hardware un Tag del software master.

El proceso de asignación debe:
1. Comparar semánticamente descripciones entre ambas tablas, teniendo en cuenta el idioma (italiano/inglés)
2. Verificar compatibilidad de tipo (input/output) y tamaño de datos
3. Utilizar las equivalencias en @SIDEL - Mixer - Equivalences.md para mejorar la coincidencia semántica
4. Verificar configuraciones estándar en @Default IO for Analog.md para señales analógicas
5. Priorizar los tags de las tablas principales ("Inputs PLCTags"/"Outputs PLCTags") sobre las secundarias

# FORMATO DE SALIDA
Crea la tabla con esta estructura exacta:
| IO | Master Tag | PLC Description | Master Description | Certeza | Alternative |

# NIVELES DE CERTEZA
Asigna niveles de certeza según estos criterios:
- Alto (90%+): Coincidencia evidente en nombre y descripción
- Medio (70-90%): Similitud semántica notable pero no exacta
- Bajo (<70%): Similitud limitada, requiere revisión manual

Para entradas con nivel de certeza medio o bajo, añade hasta 3 tags alternativos en la columna "Alternative" separados por comas.

# EXCEPCIONES
Al final del documento, crea una sección titulada "## Excepciones y Problemas" con una tabla que liste las IO sin asignación clara y el problema detectado.
"""

    # Copiar el texto al portapapeles
    try:
        pyperclip.copy(prompt_text)
        print("¡Prompt generado y copiado al portapapeles con éxito!")

        # Guardar el prompt en un archivo para referencia en el directorio de datos
        prompt_file_path = os.path.join(data_directory, "IO_Adaptation_Prompt.txt")
        with open(prompt_file_path, "w", encoding="utf-8") as f:
            f.write(prompt_text)
        print(f"Prompt guardado en: {prompt_file_path}")

        # Mostrar mensaje de éxito
        print(f"¡Prompt generado y copiado al portapapeles con éxito!")
        print(f"Prompt guardado en: {prompt_file_path}")
        if conversion_desde == "TwinCat":
            print(f"Archivos copiados de TwinCat: {len(copied_files)} archivos")
        else:
            print(f"Archivos copiados de Obsidian: {len(copied_files)} archivos")

        # Abrir Cursor en el directorio de datos
        print("Abriendo Cursor en el directorio de datos...")
        open_cursor_in_directory(data_directory)

        return True
    except Exception as e:
        print(f"Error al copiar al portapapeles: {e}")
        print("Por favor, instale pyperclip con 'pip install pyperclip'")
        return False


# Agregar una función para copiar el archivo adaptado a Obsidian
def copy_adapted_file_to_obsidian():
    """Copia el archivo IO Adapted.md al directorio de IO en Obsidian si existe"""
    try:
        configs = load_configuration()
        working_directory = configs.get("working_directory")
        if not working_directory:
            return False

        # Verificar si el archivo existe en el directorio de trabajo
        source_file = os.path.join(working_directory, "IO Adapted.md")
        if not os.path.isfile(source_file):
            print(f"Archivo '{source_file}' no encontrado.")
            return False

        # Obtener la ruta de destino en Obsidian
        group_config = configs.get("level3", {})
        obsidian_dir = group_config.get("ObsideanDir")
        obsidian_projects_base = group_config.get("ObsideanProjectsBase")

        if not obsidian_dir or not obsidian_projects_base:
            print("Configuración de Obsidian incompleta.")
            return False

        # Construir la ruta de destino
        obsidian_io_path = os.path.join(
            obsidian_dir, obsidian_projects_base.lstrip("\\"), "IO"
        )

        # Crear la carpeta si no existe
        if not os.path.exists(obsidian_io_path):
            os.makedirs(obsidian_io_path)

        # Definir el destino
        dest_file = os.path.join(obsidian_io_path, "IO Adapted.md")

        # Copiar el archivo
        shutil.copy2(source_file, dest_file)
        print(f"Archivo copiado exitosamente a: {dest_file}")

        return True
    except Exception as e:
        print(f"Error al copiar archivo a Obsidian: {e}")
        return False


if __name__ == "__main__":
    print("Generador de prompt para adaptación de IO")
    print("=========================================")
    generate_prompt()
