import subprocess
import sys
import re
import time
import ollama

def install_package(package_name):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package_name])

def generate_code_from_idea(idea):
    prompt = f"Generează un program Python care să îndeplinească următoarea cerință: {idea}"
    response = ollama.chat(model='qwen2.5-coder', messages=[{'role': 'user', 'content': prompt}])
    match = re.search(r"```python(.*?)```", response['message']['content'], re.DOTALL)
    return match.group(1).strip() if match else None

def run_code(code):
    try:
        exec_globals = {}
        start_time = time.time()
        exec(code, exec_globals)
        end_time = time.time()
        exec_time = end_time - start_time
        return None, exec_time
    except Exception as e:
        return str(e), None

def display_options():
    print("Opțiuni disponibile:")
    print("1. Introdu o nouă idee de program.")
    print("2. Sugestii de idei predefinite.")
    print("3. Ieșire.")

def suggest_ideas():
    print("Sugestii de idei:")
    print("- Calculează media aritmetică a unei liste de numere.")
    print("- Generează un joc simplu de ghicit un număr.")
    print("- Creează un script care descarcă imagini de pe internet.")
    print("- Creează un calendar interactiv cu evenimente.")

def main():
    print("Bine ai venit la Generatorul Interactiv de Programe Python!")
    while True:
        display_options()
        option = input("Alege o opțiune (1, 2 sau 3): ")

        if option == "1":
            idea = input("Introdu ideea ta de program: ")
        elif option == "2":
            suggest_ideas()
            idea = input("Alege una dintre ideile sugerate sau introdu propria idee: ")
        elif option == "3":
            print("La revedere!")
            break
        else:
            print("Opțiune invalidă. Te rog să alegi din nou.")
            continue

        print("Generare cod...")
        code = generate_code_from_idea(idea)

        if not code:
            print("Nu am putut genera un cod valid. Încearcă altă idee sau verifică conexiunea la rețea.")
            continue

        print(f"Cod generat:\n{code}\n")
        save_option = input("Dorești să salvezi acest cod într-un fișier? (da/nu): ")
        if save_option.lower() == "da":
            file_name = input("Introdu numele fișierului (exemplu: program.py): ")
            with open(file_name, "w") as f:
                f.write(code)
            print(f"Codul a fost salvat în {file_name}")

        print("Rulare cod...")
        error_message, exec_time = run_code(code)

        if error_message:
            print(f"Eroare detectată: {error_message}")
            missing_modules = re.findall(r"No module named '(\w+)'", error_message)
            for module in missing_modules:
                print(f"Instalez modulul: {module}...")
                try:
                    install_package(module)
                except Exception as e:
                    print(f"Eroare la instalarea modulului {module}: {e}")
                    break
        else:
            print(f"Codul a rulat cu succes în {exec_time:.2f} secunde și îndeplinește cerința.")
            retry_option = input("Dorești să generezi un alt cod pentru aceeași idee? (da/nu): ")
            if retry_option.lower() != "da":
                break

if __name__ == "__main__":
    main()
