import os
import json
from pathlib import Path

# Use o caminho correto para sua pasta de músicas (a pasta PRINCIPAL,
# onde ficam os arquivos de áudio soltos e/ou as subpastas — que por
# sua vez podem ter outras pastas dentro, em qualquer profundidade,
# até chegar nas músicas). Mesma lógica do gerar_albums.py.
RAIZ_MUSICAS = r"C:\Users\Gerson Wandermurem\Desktop\Arquivos do Projeto\Musicas"

# O musicas.json é salvo dentro da própria pasta raiz, que é onde o
# jogosdasfotos.html espera encontrar (Musicas/musicas.json).
SAIDA = os.path.join(RAIZ_MUSICAS, "musicas.json")

EXTENSOES_AUDIO = {
    ".mp3", ".wav", ".ogg", ".aac", ".m4a",
    ".flac", ".wma", ".opus", ".webm",
    ".mp4", ".m4v"
}

# Nome da pasta raiz (ex: "Musicas") — usado para montar o "caminho"
# de cada nó, do mesmo jeito que o site espera (relativo à raiz do
# túnel, ex: "Musicas/Sub/SubSub").
NOME_PASTA_RAIZ = os.path.basename(os.path.normpath(RAIZ_MUSICAS))


def eh_audio(nome_arquivo):
    return Path(nome_arquivo).suffix.lower() in EXTENSOES_AUDIO


def construir_no(pasta):
    """
    Monta recursivamente o "nó" de uma pasta de música:
    - suas músicas diretas (se tiver)
    - suas subpastas, cada uma virando um nó filho (se tiverem
      música em algum nível)
    Retorna None se a pasta (e tudo dentro dela) não tiver nenhuma música.
    """
    pasta = Path(pasta)

    arquivos = sorted(
        item.name for item in pasta.iterdir()
        if item.is_file() and eh_audio(item.name)
    )

    filhos = []
    for item in sorted(pasta.iterdir(), key=lambda p: p.name.lower()):
        if item.is_dir():
            no_filho = construir_no(item)
            if no_filho is not None:
                filhos.append(no_filho)

    if not arquivos and not filhos:
        # Pasta vazia (sem música em nenhum nível dentro dela) -> ignora
        return None

    caminho_relativo = os.path.relpath(pasta, RAIZ_MUSICAS).replace("\\", "/")
    caminho = NOME_PASTA_RAIZ if caminho_relativo == "." else f"{NOME_PASTA_RAIZ}/{caminho_relativo}"

    return {
        "nome": pasta.name,
        "caminho": caminho,   # usado pelo jogosdasfotos.html para montar a URL das músicas desta pasta
        "arquivos": arquivos,  # músicas direto nesta pasta (pode ser [])
        "children": filhos,    # subpastas (pode ser [])
    }


def contar_musicas(no):
    total = len(no["arquivos"])
    for filho in no["children"]:
        total += contar_musicas(filho)
    return total


def gerar_musicas():
    raiz = Path(RAIZ_MUSICAS)
    if not raiz.is_dir():
        print(f"❌ Pasta não encontrada: {RAIZ_MUSICAS}")
        return

    arvore = []

    # Músicas soltas direto na pasta raiz (sem estar dentro de nenhuma
    # subpasta) viram um item "Raiz" no topo da árvore.
    audios_raiz = sorted(
        item.name for item in raiz.iterdir()
        if item.is_file() and eh_audio(item.name)
    )
    if audios_raiz:
        arvore.append({
            "nome": "Raiz",
            "caminho": NOME_PASTA_RAIZ,
            "arquivos": audios_raiz,
            "children": [],
        })
        print(f"[OK] Raiz -> {len(audios_raiz)} música(s)")

    # Cada subpasta da raiz vira um item de primeiro nível, podendo ter
    # outras pastas dentro, em qualquer profundidade — igual ao
    # gerar_albums.py.
    for item in sorted(raiz.iterdir(), key=lambda p: p.name.lower()):
        if item.is_dir():
            no = construir_no(item)
            if no is not None:
                arvore.append(no)
                print(f"[OK] {no['nome']} -> {contar_musicas(no)} música(s) no total")
            else:
                print(f"[--] {item.name} (pasta vazia, ignorada)")

    with open(SAIDA, "w", encoding="utf-8") as f:
        json.dump(arvore, f, ensure_ascii=False, indent=2)

    total_musicas = sum(contar_musicas(no) for no in arvore)
    print(f"\nConcluído: {len(arvore)} pasta(s) principal(is), {total_musicas} música(s) no total, geradas em:\n{SAIDA}")


if __name__ == "__main__":
    gerar_musicas()
