# organizer.py
# Funções para categorizar ficheiros e criar estrutura de destino
from pathlib import Path
from datetime import datetime


def categorizar_por_tipo(ficheiro: str) -> str:
    """
    Devolve o tipo de ficheiro (imagem, documento, vídeo, etc) com base na extensão.

    argumentos:
    ficheiro (str) -> caminho do ficheiro

    retorna:
    str -> tipo de ficheiro
    """
    # TODO: extensões configuraveis externamente pelo utilizador
    # ficheiro configuração: uniq.toml
    # carregar categorias e tipos de ficheiro da tabela 'tipos_ficheiros'
    extensao = Path(ficheiro).suffix.lower()
    if extensao in [".jpeg", ".jpg", ".bmp", ".cr2", ".raw", ".png"]:
        return "imagem"
    elif extensao in [".pdf", ".doc", ".docx", ".xls", ".xlsx"]:
        return "documento"
    elif extensao in [".mp4", ".mpeg", ".mov"]:
        return "video"
    elif extensao in [".mp3", "wav", ".aac"]:
        return "audio"
    else:
        return "outros"


def obter_data_ficheiro(ficheiro: str, usar_criacao: bool = False) -> datetime:
    """
    Devolve a data de modificação ou criação do ficheiro.

    argumentos:
    ficheiro (str) -> caminho do ficheiro
    usar_criacao (bool) -> retornar data de criação de ficheiro (defeito: False)

    retorna:
    datetime -> data de modificação ou criação do ficheiro
    """
    stats_ficheiro = Path(ficheiro).stat()
    timestamp = stats_ficheiro.st_ctime if usar_criacao else stats_ficheiro.st_mtime
    return datetime.fromtimestamp(timestamp)


def criar_pasta_destino(
    base_destino: str,
    categoria: str,
    data: datetime | None = None,
    formato_data: str = "%d-%m-%Y",
) -> Path:
    """
    Cria a pasta de destino apropriada, se não existir.

    argumentos:
    base_destino (str) -> directorio raiz para criar novo directorio
    categoria (str) -> nome do novo directorio a criar
    data (datetime | None) -> nome para subdirectorio para categorizar por data (defeito: None, não criar subdirectorio de data)
    formato_data (str) -> formato da data ppara o nome da pasta (defeito: '%d-%m-%Y')

    retorna:
    Path -> caminho completo para o novo directorio criado
    """
    if isinstance(data, datetime):
        data_directorio = data.strftime(formato_data)
    else:
        data_directorio = ""
    caminho_novo_directorio = Path(base_destino) / categoria / data_directorio
    caminho_novo_directorio.mkdir(parents=True, exist_ok=True)
    return caminho_novo_directorio
