import os
import requests
import subprocess
import sys
import re
import time
from colorama import init, Fore, Style
from rich.console import Console
from rich.panel import Panel
from rich.prompt import Prompt
from rich.progress import Progress

console = Console()
init()

class ProjectManager:
    def __init__(self, host):
        self.host = host
        self.workspace = "workspace"
        os.makedirs(self.workspace, exist_ok=True)

    def get_ai_response(self, prompt):
        try:
            response = requests.post(
                f"{self.host}/api/chat",
                json={
                    "model": "deepseek-r1:70b",
                    "messages": [{"role": "user", "content": prompt}],
                },
            )
            response.raise_for_status()
            return response.json().get("message", {}).get("content", "")
        except requests.RequestException as e:
            console.print(f"[red]Eroare la comunicarea cu serverul: {str(e)}")
            return None
        except ValueError:
            console.print("[red]Răspuns invalid primit de la server.")
            return None

    def create_plan(self, task):
        prompt = (
            f"Pentru sarcina: {task}\n"
            "Creează un plan de acțiune pas cu pas. Răspunde doar cu pașii numerotați. "
            "Unde este necesar, propune facerea unui script pentru a îndeplini această sarcină."
        )
        plan = self.get_ai_response(prompt)
        if not plan:
            console.print("[red]Nu am putut obține un plan de la AI.")
            return []

        steps = [line.strip() for line in plan.split("\n") if re.match(r"^\d+\.\s", line.strip())]
        return steps

    def create_script(self, task):
        prompt = f"Scrie un script Python pentru: {task}\nRăspunde doar cu codul, fără explicații."
        code = self.get_ai_response(prompt)
        if not code:
            console.print("[red]Nu am putut genera cod pentru această sarcină.")
            return None

        # Extrage doar codul Python
        code = re.sub(r"```python\s*|\s*```", "", code)
        return code.strip()

    def run_script(self, code, filename):
        filepath = os.path.join(self.workspace, filename)
        with open(filepath, "w") as f:
            f.write(code)

        try:
            process = subprocess.Popen(
                [sys.executable, filepath],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                bufsize=1,
                universal_newlines=True,
            )

            console.print("[cyan]Output script:[/]")
            with Progress() as progress:
                task = progress.add_task("[green]Rulăm scriptul...", total=100)

                while True:
                    output = process.stdout.readline()
                    if output == "" and process.poll() is not None:
                        break
                    if output:
                        console.print(output.strip())
                        progress.advance(task, 10)

            stderr_output = process.stderr.read()
            if stderr_output:
                console.print(f"[red]Erori din script:\n{stderr_output}")

            return process.poll() == 0
        except Exception as e:
            console.print(f"[red]Eroare la rularea scriptului: {str(e)}")
            return False

    def execute_project(self, task):
        console.print(Panel(f"[bold blue]Proiect: {task}"))

        # 1. Creare plan
        console.print("[yellow]Generez plan...[/]")
        steps = self.create_plan(task)
        if not steps:
            console.print("[red]Nu am putut genera un plan.")
            return

        console.print("\n[bold cyan]Plan de execuție:[/]")
        for step in steps:
            console.print(f"[green]{step}[/]")

        if Prompt.ask("\nConfirmați planul?", choices=["da", "nu"], default="da") != "da":
            return

        # 2. Execuție pași
        for i, step in enumerate(steps, 1):
            console.print(f"\n[bold cyan]Execut pas {i}: {step}[/]")

            while True:
                code = self.create_script(step)
                if not code:
                    console.print("[red]Nu am reușit să genereze cod pentru acest pas.")
                    break

                console.print("\n[cyan]Cod generat:[/]")
                console.print(Panel(code, title=f"Pasul {i}"))

                if Prompt.ask("Rulăm acest cod?", choices=["da", "nu"], default="da") != "da":
                    if Prompt.ask("Doriți să treceți la următorul pas?", choices=["da", "nu"], default="da") == "da":
                        break
                    continue

                filename = f"step_{i}.py"
                if self.run_script(code, filename):
                    console.print("[green]Pas finalizat cu succes![/]")
                    break

                if Prompt.ask("Reîncercăm acest pas?", choices=["da", "nu"], default="da") != "da":
                    return


def main():
    host = Prompt.ask("Introduceți adresa OLLAMA_HOST")
    manager = ProjectManager(host)

    while True:
        task = Prompt.ask("\n[bold cyan]Introduceți o sarcină (sau 'exit' pentru a ieși):[/]")
        if task.lower() == "exit":
            break
        manager.execute_project(task)


if __name__ == "__main__":
    main()
