import os
import argparse
import shutil
import re
import subprocess
from colorama import init, Fore, Style

init(autoreset=True)

ESTRUTURA = {
    "src": ["app", "core", "integracoes", "utils", "api"],
    "config": [],
    "dados": [],
    "logs": [],
    "tests": [],
}

ARQUIVOS_BASE = [
    "requirements.txt",
    "README.md",
    "main.py"
]

def validar_nome_projeto(nome):
    """Verifica se o nome do projeto é válido (sem espaços e caracteres especiais)."""
    if re.match(r'^[a-zA-Z0-9_-]+$', nome):
        return True
    print("Erro: O nome do projeto contém caracteres inválidos! Use apenas letras, números, hífens ou underscores.")
    return False

def criar_arquitetura(caminho_base,  criar_venv=True, inicializar_git_flag=False):
    """Cria a estrutura do projeto no caminho especificado."""
    if not os.path.exists(caminho_base):
        os.makedirs(caminho_base)

    for pasta, subpastas in ESTRUTURA.items():
        pasta_path = os.path.join(caminho_base, pasta)
        os.makedirs(pasta_path, exist_ok=True)
        for subpasta in subpastas:
            os.makedirs(os.path.join(pasta_path, subpasta), exist_ok=True)

    for arquivo in ARQUIVOS_BASE:
        caminho_arquivo = os.path.join(caminho_base, arquivo)
        if not os.path.exists(caminho_arquivo):
            with open(caminho_arquivo, "w", encoding="utf-8") as f:
                if arquivo == "README.md":
                    f.write(f"# Projeto\n\nDescrição do projeto.")
                elif arquivo == "requirements.txt":
                    f.write("# Lista de dependências do projeto\n")
                elif arquivo == "main.py":
                    f.write("# Ponto de entrada do projeto\n\nif __name__ == '__main__':\n    print('Projeto iniciado!')")

    if inicializar_git_flag:
        inicializar_git(caminho_base)
        
    if criar_venv:  
        criar_ambiente_virtual(caminho_base)
        
    print(Fore.GREEN + "✅ Estrutura do projeto foi gerada com sucesso! 🎉")
    print(Fore.YELLOW + f"🔧 Estrutura do projeto foi configurada corretamente com os seguintes diretórios e arquivos: ")
    print(Fore.CYAN + f"    ├── /src/                # Código-fonte principal")
    print(Fore.CYAN + f"    ├── /config/             # Arquivos de configuração")
    print(Fore.CYAN + f"    ├── /dados/              # Entrada/Saída de arquivos")
    print(Fore.CYAN + f"    ├── /logs/               # Logs detalhados de execução")
    print(Fore.CYAN + f"    ├── /tests/              # Testes unitários")
    print(Fore.CYAN + f"    ├── requirements.txt     # Dependências do projeto")
    print(Fore.CYAN + f"    ├── README.md            # Documentação do projeto")
    print(Fore.CYAN + f"    └── main.py              # Ponto de entrada do projeto\n")
    print(Fore.GREEN + f"🚀 Agora você pode começar a desenvolver🤖!\n")

def inicializar_git(caminho_base):
    """Inicializa um repositório Git no diretório do projeto e cria um .gitignore padrão."""
    gitignore_path = os.path.join(caminho_base, ".gitignore")
    if not os.path.exists(gitignore_path):
        os.system(f"cd {caminho_base} && git init")
        with open(gitignore_path, "w") as f:
            f.write("""
# Python
__pycache__/
*.pyc
*.pyo
*.pyd
venv/
.env
logs/
""")

def criar_ambiente_virtual(caminho_base):
    """Cria e ativa o ambiente virtual no projeto."""
    venv_path = os.path.join(caminho_base, "venv")
    if not os.path.exists(venv_path): 
        print(Fore.YELLOW + "🔧 Criando o ambiente virtual...")
        subprocess.run(["python", "-m", "venv", venv_path])
        ativar_ambiente_virtual(venv_path)

def ativar_ambiente_virtual(venv_path):
    """Ativa o ambiente virtual (apenas para Windows e sistemas Unix)."""
    ativacao_script = "Scripts/activate" if os.name == "nt" else "bin/activate"
    ativacao_comando = os.path.join(venv_path, ativacao_script)
    if os.name == "nt":
        subprocess.run([ativacao_comando], shell=True)
    else:
        subprocess.run(["source", ativacao_comando], shell=True)
        
        
def ativar_projeto(caminho_base):
    """Ativa o ambiente virtual de um projeto já iniciado."""
    venv_path = os.path.join(caminho_base, "venv")
    if os.path.exists(venv_path):
        print(Fore.YELLOW + "🔧 Ativando o ambiente virtual...")
        ativar_ambiente_virtual(venv_path)
    else:
        print(Fore.RED + "Erro: O ambiente virtual não foi encontrado. Certifique-se de ter criado o projeto corretamente.")

def main():
    parser = argparse.ArgumentParser(description="Ferramenta para criar estrutura de projetos.")
    parser.add_argument("comando", choices=["create", "start"], help="Comando para iniciar ou ativar o projeto")

    # parser.add_argument("comando", choices=["start", "create", "init"], help="Comando para iniciar ou ativar o projeto")
    parser.add_argument("nome", nargs="?", help="Nome do projeto (necessário para 'create' e 'start')")
    parser.add_argument("--name", help="Definir o nome do projeto")
    parser.add_argument("--git", action="store_true", help="Inicializar um repositório Git no projeto")
    parser.add_argument("--no-venv", action="store_true", help="Desativa a criação do ambiente virtual")
    
    args = parser.parse_args()

    
    if args.comando == "create":
        if args.name:  
            caminho_base = os.path.join(os.getcwd(), args.name)
            if not os.path.exists(caminho_base):
                criar_arquitetura(caminho_base, not args.no_venv)
            else:
                print(Fore.RED + f"Erro: O diretório '{args.name}' já existe!")
        else:
            criar_arquitetura(os.getcwd(), not args.no_venv, args.git)
    
    elif args.comando == "start":
        if args.nome:
            caminho_base = os.path.join(os.getcwd(), args.nome)
            if os.path.exists(caminho_base):
                ativar_projeto(caminho_base)
            else:
                print(Fore.RED + f"Erro: O diretório '{args.nome}' não existe!")
        else:
            for pasta in os.listdir(os.getcwd()):
                venv_path = os.path.join(os.getcwd(), pasta, "venv")
                if os.path.exists(venv_path):
                    ativar_projeto(os.path.join(os.getcwd(), pasta))
                    return
            print(Fore.RED + "Erro: Nenhum ambiente virtual encontrado no diretório atual.")

if __name__ == "__main__":
    main()