import click
import os
from pathlib import Path
from .core import Engine


@click.group()
@click.version_option(version='0.1.0')
def cli():
    """
    🚀 ImgBoost - Melhore a qualidade de imagens via CLI
    
    Modos disponíveis:
    - general: Melhoria geral (denoise + contrast + sharpen)
    - text: Otimizado para documentos e texto
    - dark: Otimizado para interfaces escuras (WhatsApp, etc)
    - superres: Super-resolução com IA (upscale 2x)
    """
    pass


@cli.command()
@click.argument('input_path', type=click.Path(exists=True))
@click.option('--output', '-o', default='output', help='Pasta de saída para imagens processadas.')
@click.option('--mode', '-m', 
              type=click.Choice(['general', 'text', 'dark', 'superres'], case_sensitive=False), 
              default='general', 
              help='Modo de processamento.')
@click.option('--upscale', '-u', is_flag=True, help='Aplicar Super-Resolução com IA (2x).')
@click.option('--quality', '-q', type=int, default=95, help='Qualidade JPEG de saída (1-100).')
@click.option('--format', '-f', type=click.Choice(['auto', 'png', 'jpg', 'jpeg']), 
              default='auto', help='Formato de saída.')
@click.option('--denoise-strength', '-d', type=int, default=10, help='Força do denoise (0-30).')
@click.option('--contrast', '-c', type=float, default=3.0, help='Intensidade do CLAHE (1.0-5.0).')
@click.option('--sharpen', '-s', is_flag=True, help='Aplicar sharpening extra.')
@click.option('--verbose', '-v', is_flag=True, help='Mostrar informações detalhadas.')
def process(input_path, output, mode, upscale, quality, format, denoise_strength, 
            contrast, sharpen, verbose):
    """
    Processar uma imagem ou diretório inteiro.
    
    Exemplos:
    
        imgboost process foto.jpg --mode text
        
        imgboost process ./fotos --mode dark --upscale
        
        imgboost process documento.png -m text -o melhorado
    """
    # Criar engine com configurações
    engine = Engine(
        output_dir=output,
        quality=quality,
        output_format=format,
        denoise_strength=denoise_strength,
        contrast_clip=contrast,
        extra_sharpen=sharpen,
        verbose=verbose
    )
    
    # Verificar se é diretório ou arquivo único
    input_path = Path(input_path)
    
    if input_path.is_dir():
        # Processar todos os arquivos de imagem no diretório
        image_extensions = {'.png', '.jpg', '.jpeg', '.bmp', '.tiff', '.webp'}
        files = [f for f in input_path.iterdir() 
                if f.suffix.lower() in image_extensions]
        
        if not files:
            click.echo("❌ Nenhuma imagem encontrada no diretório.", err=True)
            return
        
        click.echo(f"📂 Encontradas {len(files)} imagens para processar\n")
        
        with click.progressbar(files, 
                             label='🔧 Processando imagens',
                             show_eta=True) as bar:
            for file in bar:
                try:
                    engine.run(str(file), mode, upscale)
                except Exception as e:
                    if verbose:
                        click.echo(f"\n❌ Erro em {file.name}: {e}", err=True)
        
        click.echo(f"\n✅ Processamento concluído! Imagens salvas em: {output}/")
        
    else:
        # Processar arquivo único
        if verbose:
            click.echo(f"🚀 Processando: {input_path.name}")
            click.echo(f"📋 Modo: {mode}")
            click.echo(f"🎯 Super-resolução: {'Sim' if upscale else 'Não'}\n")
        
        try:
            output_path = engine.run(str(input_path), mode, upscale)
            click.echo(f"✅ Imagem processada com sucesso!")
            click.echo(f"💾 Salva em: {output_path}")
        except Exception as e:
            click.echo(f"❌ Erro ao processar: {e}", err=True)


@cli.command()
@click.argument('input_path', type=click.Path(exists=True))
@click.option('--output', '-o', default='output_batch', help='Pasta de saída.')
@click.option('--workers', '-w', type=int, default=4, help='Número de processos paralelos.')
def batch(input_path, output, workers):
    """
    Processar múltiplas imagens em paralelo (mais rápido).
    
    Exemplo:
        imgboost batch ./fotos --workers 8
    """
    from concurrent.futures import ProcessPoolExecutor
    from functools import partial
    
    input_path = Path(input_path)
    
    if not input_path.is_dir():
        click.echo("❌ O caminho deve ser um diretório.", err=True)
        return
    
    image_extensions = {'.png', '.jpg', '.jpeg', '.bmp', '.tiff', '.webp'}
    files = [str(f) for f in input_path.iterdir() 
            if f.suffix.lower() in image_extensions]
    
    if not files:
        click.echo("❌ Nenhuma imagem encontrada.", err=True)
        return
    
    click.echo(f"📂 {len(files)} imagens encontradas")
    click.echo(f"⚙️  Usando {workers} workers\n")
    
    engine = Engine(output_dir=output)
    process_func = partial(engine.run, mode='general', upscale=False)
    
    with ProcessPoolExecutor(max_workers=workers) as executor:
        results = list(tqdm(
            executor.map(process_func, files),
            total=len(files),
            desc="Processando"
        ))
    
    click.echo(f"\n✅ Processamento em lote concluído!")


@cli.command()
def info():
    """Mostrar informações sobre a biblioteca e dependências."""
    import cv2
    import numpy as np
    import torch
    
    click.echo("📦 ImgBoost v0.1.0")
    click.echo("\n🔧 Dependências:")
    click.echo(f"  • OpenCV: {cv2.__version__}")
    click.echo(f"  • NumPy: {np.__version__}")
    click.echo(f"  • PyTorch: {torch.__version__}")
    click.echo(f"  • CUDA disponível: {'Sim ✅' if torch.cuda.is_available() else 'Não ❌'}")
    click.echo("\n📚 Modos disponíveis:")
    click.echo("  • general   - Melhoria geral de qualidade")
    click.echo("  • text      - Otimizado para documentos e OCR")
    click.echo("  • dark      - Otimizado para UIs escuras")
    click.echo("  • superres  - Super-resolução com IA")
    click.echo("\n💡 Use 'imgboost process --help' para mais informações")


if __name__ == '__main__':
    cli()
