import os

TAMANHO_MAX = 31000  # Limite por arquivo

EXCLUIR_PASTAS = {"node_modules", "dist", "build", ".git", ".vite"}

def coletar_arquivos(diretorios, extensoes=(".js", ".ts", ".tsx", ".jsx", ".css", ".html", ".json", ".md")):
    arquivos = []
    for diretorio in diretorios:
        for raiz, pastas, nomes_arquivos in os.walk(diretorio):
            pastas[:] = [p for p in pastas if p not in EXCLUIR_PASTAS]
            for nome in nomes_arquivos:
                if nome.endswith(extensoes):
                    caminho_completo = os.path.join(raiz, nome)
                    arquivos.append(caminho_completo)
    return arquivos

def unir_em_partes(arquivos, prefixo="projeto_parte", limite=TAMANHO_MAX):
    parte = 1
    conteudo_atual = ""
    total_arquivos = 0

    for arquivo in arquivos:
        try:
            with open(arquivo, "r", encoding="utf-8") as f_origem:
                conteudo = f_origem.read()
        except Exception as e:
            print(f"⚠️ Erro ao ler {arquivo}: {e}")
            continue

        bloco = f"\n\n// === Início de: {arquivo} ===\n{conteudo}\n// === Fim de: {arquivo} ===\n"
        
        if len(conteudo_atual) + len(bloco) > limite:
            nome_saida = f"{prefixo}{parte}.c"
            with open(nome_saida, "w", encoding="utf-8") as f_saida:
                f_saida.write(conteudo_atual)
            print(f"✅ Criado: {nome_saida}")
            parte += 1
            conteudo_atual = ""

        conteudo_atual += bloco
        total_arquivos += 1

    if conteudo_atual:
        nome_saida = f"{prefixo}{parte}.c"
        with open(nome_saida, "w", encoding="utf-8") as f_saida:
            f_saida.write(conteudo_atual)
        print(f"✅ Criado: {nome_saida}")

    print(f"\n🔹 {total_arquivos} arquivos de código processados.")
    print(f"🔹 Arquivos gerados: {parte}")

def main():
    diretorio_base = "."

    # Subpastas principais que queremos incluir (se existirem)
    componentes_escolhidos = ["src", "public", "config", "utils", "routes", "middleware"]
    diretorios_para_incluir = [os.path.join(diretorio_base, nome) 
                               for nome in componentes_escolhidos 
                               if os.path.exists(os.path.join(diretorio_base, nome))]

    # Arquivos individuais importantes na raiz do projeto
    arquivos_extras = []
    for nome in ["vite.config.js", "vite.config.ts", "package.json", "tsconfig.json", "server.js"]:
        caminho = os.path.join(diretorio_base, nome)
        if os.path.isfile(caminho):
            arquivos_extras.append(caminho)

    # Coleta os arquivos das pastas
    arquivos_das_pastas = coletar_arquivos(diretorios_para_incluir)

    # Junta tudo
    arquivos = arquivos_das_pastas + arquivos_extras
    unir_em_partes(arquivos)


if __name__ == "__main__":
    main()
