import os
from typing import List, Dict, Any, Optional

def clean_path(path: str) -> str:
    """Limpia la ruta de caracteres innecesarios."""
    if not path:
        return ""
    return path.strip().replace('@', '')


def read_file_tool(path: str, start_line: Optional[int] = None, end_line: Optional[int] = None) -> Dict[str, Any]:
    """
    Lee un archivo y devuelve su contenido.
    Puede leer una sección si se indican start_line y end_line (1-indexed).
    """
    path = clean_path(path)
    if not path:
        return {"error": "Path no proporcionado"}

    try:
        with open(path, 'r', encoding='utf-8') as f:
            lines = f.readlines()
            total_lines = len(lines)
            
        if start_line is not None or end_line is not None:
            start = max(0, (start_line or 1) - 1)
            end = min(total_lines, (end_line or total_lines))
            
            if start >= total_lines or start >= end:
                content = ""
            else:
                content = "".join(lines[start:end])
                
            return {
                "file_path": path, 
                "content": content,
                "lines_read": f"{start + 1}-{end}",
                "total_lines": total_lines
            }

        content = "".join(lines)
        return {"file_path": path, "content": content, "total_lines": total_lines}
    except FileNotFoundError:
        return {"error": f"El archivo '{path}' no fue encontrado."}
    except Exception as e:
        return {"error": f"Error al leer '{path}': {e}"}


def read_many_files_tool(paths: List[str]) -> Dict[str, Any]:
    """Lee múltiples archivos de forma eficiente en una sola llamada."""
    if not paths:
        return {"error": "No se proporcionaron rutas"}

    results = []
    for p in paths:
        results.append(read_file_tool(p))

    return {"files": results}


def get_file_info_tool(path: str) -> Dict[str, Any]:
    """Obtiene metadatos detallados (tamaño, fechas, tipo) de un archivo o directorio."""
    path = clean_path(path)
    if not path:
        return {"error": "Path no proporcionado"}

    if not os.path.exists(path):
        return {"error": f"La ruta '{path}' no existe."}

    try:
        stat_info = os.stat(path)
        return {
            "path": path,
            "is_dir": os.path.isdir(path),
            "size_bytes": stat_info.st_size,
            "size_mb": round(stat_info.st_size / (1024 * 1024), 2),
            "created": stat_info.st_ctime,
            "modified": stat_info.st_mtime
        }
    except Exception as e:
        return {"error": f"Error al obtener información de '{path}': {e}"}


# Metadata para el sistema de skills (debe estar al final, DESPUÉS de definir las funciones)

read_file_tool.operation_summary = "Leyendo archivo: {path}"
read_many_files_tool.operation_summary = "Leyendo múltiples archivos"
get_file_info_tool.operation_summary = "Obteniendo información de: {path}"

# Schema de parámetros para cada herramienta
read_file_tool.parameters_schema = {
    "type": "object",
    "properties": {
        "path": {"type": "string", "description": "Ruta del archivo a leer"},
        "start_line": {"type": "integer", "description": "Línea inicial (opcional, 1-based)"},
        "end_line": {"type": "integer", "description": "Línea final (opcional, 1-based)"}
    },
    "required": ["path"]
}
read_file_tool.name = "read_file_tool"
read_file_tool.description = "Lee el contenido de un archivo. Soporta lectura parcial con start_line y end_line."

read_many_files_tool.parameters_schema = {
    "type": "object",
    "properties": {
        "paths": {"type": "array", "items": {"type": "string"}, "description": "Lista de rutas de archivos a leer"}
    },
    "required": ["paths"]
}
read_many_files_tool.name = "read_many_files_tool"
read_many_files_tool.description = "Lee múltiples archivos de forma eficiente en una sola llamada."

get_file_info_tool.parameters_schema = {
    "type": "object",
    "properties": {
        "path": {"type": "string", "description": "Ruta del archivo o directorio"}
    },
    "required": ["path"]
}
get_file_info_tool.name = "get_file_info_tool"
get_file_info_tool.description = "Obtiene metadatos detallados (tamaño, fechas, tipo) de un archivo o directorio."