def main_simbelmyne(parsed_args):
    from args_main import parse_arguments_main
    from low_level import print_starting_module, print_message, print_ending_module, progress_bar_from_logfile
    from os.path import isfile
    import subprocess
    
    print_starting_module("simbelmyne", verbose=parsed_args.verbose)
    main_dict = parse_arguments_main(parsed_args)
    paramfile=parsed_args.paramfile
    if paramfile is None:
        paramfile = main_dict["paramdir"]+"parameters_"+main_dict["simname"]+".sbmy"
    log_file = main_dict["logdir"]+main_dict["simname"]+".log"

    if parsed_args.execution == "local":
        print_message("Running Simbelyne in local mode.", 1, "simbelmyne", verbose=parsed_args.verbose)

        if isfile(log_file): # Remove the preexisting log file to allow for the progress_bar to be run normally
            from os import remove
            oremove(log_file)

        command_args = ["simbelmyne", paramfile, log_file]

        if parsed_args.verbose < 2:
            subprocess.Popen(command_args, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) # Use Popen instead of run to be able to display the progress bar
            if not main_dict["mode"] in ["pre_sCOLA", "post_sCOLA", "allsCOLA"]: # No progress bar for pre/post sCOLA
                progress_bar_from_logfile(log_file, desc=main_dict["simname"], verbose=parsed_args.verbose, leave=False)
        else:
            subprocess.run(command_args)

        print_message("Simbelyne finished.", 1, "simbelmyne", verbose=parsed_args.verbose)
    
    elif parsed_args.execution == "slurm":
        from slurm_submission import create_slurm_script, parse_arguments_slurm
        from args_main import parse_arguments_main
        print_message("Running simbelmyne in slurm mode.", 1, "simbelmyne", verbose=parsed_args.verbose)
        slurm_dict=parse_arguments_slurm(parsed_args)
        main_dict=parse_arguments_main(parsed_args)
        slurm_script = slurm_dict["scripts"]+"simbelmyne_"+main_dict["simname"]+".sh"

        if not isfile(slurm_script) or parsed_args.force:
            print_message(f"SLURM script {slurm_script} does not exist (or forced). Creating it.", 2, "simbelmyne", verbose=parsed_args.verbose)
            create_slurm_script(
                slurm_template=slurm_dict["simbelmyne_template"],
                slurm_script=slurm_script,
                job="simbelmyne",
                job_config_file=paramfile,
                job_log=log_file,
                job_name=main_dict["simname"],
            )
            print_message(f"SLURM script written to {slurm_script}.", 3, "simbelmyne", verbose=parsed_args.verbose)
        else:
            print_message(f"SLURM script {slurm_script} exists.", 2, "simbelmyne", verbose=parsed_args.verbose)
        
        print_message(f"Submitting simbelmyne job to SLURM.", 1, "simbelmyne", verbose=parsed_args.verbose)

        command_args = ["sbatch", slurm_script]

        if isfile(log_file): # Remove the preexisting log file to allow for the progress_bar to be run normally
            from os import remove
            remove(log_file)

        if parsed_args.verbose < 2:
            subprocess.run(command_args, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        else:
            subprocess.run(command_args)

        print_message("Simbelmyne job submitted.", 2, "simbelmyne", verbose=parsed_args.verbose)
        if not main_dict["mode"] in ["pre_sCOLA", "post_sCOLA", "allsCOLA"]: # No progress bar for pre/post sCOLA
            progress_bar_from_logfile(log_file, desc=main_dict["simname"], verbose=parsed_args.verbose)
    
    else:
        raise ValueError(f"Execution mode {parsed_args.execution} not recognized.")
    
    print_ending_module("simbelmyne", verbose=parsed_args.verbose)


if __name__ == "__main__":
    from argparse import ArgumentParser
    from args_main import register_arguments_main
    from timestepping import register_arguments_timestepping, main_timestepping
    from parameters_card import register_arguments_card, main_parameter_card
    from cosmo_params import register_arguments_cosmo
    from parameters_simbelmyne import register_arguments_simbelmyne
    from slurm_submission import register_arguments_slurm

    parser = ArgumentParser(description="Run Simbelmyne.")
    register_arguments_main(parser)
    register_arguments_timestepping(parser)
    register_arguments_simbelmyne(parser)
    register_arguments_slurm(parser)
    register_arguments_card(parser)
    register_arguments_cosmo(parser)
    parsed_args = parser.parse_args()

    main_parameter_card(parsed_args)
    main_timestepping(parsed_args)
    main_simbelmyne(parsed_args)