#!/usr/bin/env python3
"""
Utilidades para BambuLuc
========================
"""

import hashlib
import os
from typing import Optional

def calculate_md5(file_path: str) -> str:
    """
    Calcular MD5 de un archivo
    
    Args:
        file_path: Ruta del archivo
        
    Returns:
        str: Hash MD5 en mayúsculas
    """
    with open(file_path, 'rb') as f:
        return hashlib.md5(f.read()).hexdigest().upper()

def format_time(seconds: int) -> str:
    """
    Formatear tiempo en formato legible
    
    Args:
        seconds: Tiempo en segundos
        
    Returns:
        str: Tiempo formateado (ej: "1h 30m 45s")
    """
    if seconds < 60:
        return f"{seconds}s"
    elif seconds < 3600:
        return f"{seconds//60}m {seconds%60}s"
    else:
        hours = seconds // 3600
        minutes = (seconds % 3600) // 60
        return f"{hours}h {minutes}m"

def format_size(bytes_size: int) -> str:
    """
    Formatear tamaño en formato legible
    
    Args:
        bytes_size: Tamaño en bytes
        
    Returns:
        str: Tamaño formateado (ej: "6.7 MB")
    """
    for unit in ['B', 'KB', 'MB', 'GB']:
        if bytes_size < 1024.0:
            return f"{bytes_size:.1f} {unit}"
        bytes_size /= 1024.0
    return f"{bytes_size:.1f} TB"

def validate_ip(ip: str) -> bool:
    """
    Validar dirección IP
    
    Args:
        ip: Dirección IP a validar
        
    Returns:
        bool: True si es válida
    """
    try:
        parts = ip.split('.')
        if len(parts) != 4:
            return False
        
        for part in parts:
            if not 0 <= int(part) <= 255:
                return False
        
        return True
    except:
        return False

def validate_file_extension(file_path: str, valid_extensions: list = None) -> bool:
    """
    Validar extensión de archivo
    
    Args:
        file_path: Ruta del archivo
        valid_extensions: Lista de extensiones válidas
        
    Returns:
        bool: True si es válida
    """
    if valid_extensions is None:
        valid_extensions = ['.gcode', '.3mf', '.gcode.3mf']
    
    file_ext = os.path.splitext(file_path)[1].lower()
    
    # Verificar extensión doble como .gcode.3mf
    if file_path.lower().endswith('.gcode.3mf'):
        return '.gcode.3mf' in valid_extensions
    
    return file_ext in valid_extensions
