import os
import sys
import git
import subprocess
import argparse
from pathlib import Path
from ascii_colors import ASCIIColors, trace_exception

def run_git_pull():
    try:
        print("----------------> Updating the code <-----------------------")
        
        repo = git.Repo(Path(__file__).parent)
        origin = repo.remotes.origin
        origin.pull()
        print("Updating submodules")
        try:
            repo.git.submodule('update', '--init')
            # Checkout the main branch on each submodule
            for submodule in repo.submodules:
                try:
                    submodule_repo = submodule.module()
                    submodule_repo.git.checkout('main')
                    print(f"Checking out main from {submodule}")
                    submodule.repo.git.submodule('update', '--remote', submodule.name)  # Force submodule update
                    print(f"Forcing update on {submodule}")
                    submodule_repo.git.checkout('main')

                except Exception as ex:
                    print(f"Couldn't checkout module {submodule}")
                    
            execution_path = Path(os.getcwd())

            # Clone the repository to the target path
            ASCIIColors.info("Lollms_core found in the app space.\nPulling last lollms_core")
            subprocess.run(["git", "-C", str(execution_path/"lollms_core"), "pull"])            
            subprocess.run(["git", "-C", str(execution_path/"utilities/safe_store"), "pull"])         
              
                    
        except Exception as ex:
            print("Couldn't update submodules")
            print(ex)
        return True
    except git.GitCommandError as e:
        print(f"Error during git pull: {e}")
        return False

def install_requirements():
    try:
        subprocess.check_call(["pip", "install", "--upgrade", "-r", "requirements.txt"])
        subprocess.check_call(["pip", "install", "--upgrade", "-e", "lollms_core"])
        subprocess.check_call(["pip", "install", "--upgrade", "-e", "utilities/safe_store"])
    except subprocess.CalledProcessError as e:
        print(f"Error during pip install: {e}")

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--repo", type=str, default="https://github.com/ParisNeo/lollms-webui.git", help="Path to the Git repository")
    args = parser.parse_args()

    repo_path = args.repo

    # Perform git pull to update the repository
    run_git_pull()

    # Install the new requirements
    install_requirements()

    # Reload the main script with the original arguments
    temp_file = "temp_args.txt"
    if os.path.exists(temp_file):
        with open(temp_file, "r") as file:
            args = file.read().split()
        main_script = "app.py"  # Replace with the actual name of your main script
        os.system(f"python {main_script} {' '.join(args)}")
        os.remove(temp_file)
    else:
        print("Error: Temporary arguments file not found.")
        sys.exit(1)

if __name__ == "__main__":
    main()