"""
Simple NX Journal Script to Just Solve Simulation

This is a simplified version that just opens and solves the simulation
without trying to update linked parts (for simple models).

Usage: run_journal.exe solve_simulation_simple.py <sim_file_path>
"""

import sys
import NXOpen
import NXOpen.CAE


def main(args):
    """
    Open and solve a simulation file without updates.

    Args:
        args: Command line arguments
              args[0]: .sim file path
    """
    if len(args) < 1:
        print("ERROR: No .sim file path provided")
        return False

    sim_file_path = args[0]

    print(f"[JOURNAL] Opening simulation: {sim_file_path}")

    try:
        theSession = NXOpen.Session.GetSession()

        # Set load options to load linked parts from directory
        print("[JOURNAL] Setting load options for linked parts...")
        import os
        working_dir = os.path.dirname(os.path.abspath(sim_file_path))

        # Complete load options setup
        theSession.Parts.LoadOptions.LoadLatest = False
        theSession.Parts.LoadOptions.ComponentLoadMethod = NXOpen.LoadOptions.LoadMethod.FromDirectory

        searchDirectories = [working_dir]
        searchSubDirs = [True]
        theSession.Parts.LoadOptions.SetSearchDirectories(searchDirectories, searchSubDirs)

        theSession.Parts.LoadOptions.ComponentsToLoad = NXOpen.LoadOptions.LoadComponents.All
        theSession.Parts.LoadOptions.PartLoadOption = NXOpen.LoadOptions.LoadOption.FullyLoad
        theSession.Parts.LoadOptions.SetInterpartData(True, NXOpen.LoadOptions.Parent.All)
        theSession.Parts.LoadOptions.AllowSubstitution = False
        theSession.Parts.LoadOptions.GenerateMissingPartFamilyMembers = True
        theSession.Parts.LoadOptions.AbortOnFailure = False

        referenceSets = ["As Saved", "Use Simplified", "Use Model", "Entire Part", "Empty"]
        theSession.Parts.LoadOptions.SetDefaultReferenceSets(referenceSets)
        theSession.Parts.LoadOptions.ReferenceSetOverride = False

        print(f"[JOURNAL] Load directory set to: {working_dir}")

        # Close any currently open parts
        print("[JOURNAL] Closing any open parts...")
        try:
            partCloseResponses1 = [NXOpen.BasePart.CloseWholeTree]
            theSession.Parts.CloseAll(partCloseResponses1)
        except:
            pass

        # Open the .sim file
        print(f"[JOURNAL] Opening simulation...")
        basePart1, partLoadStatus1 = theSession.Parts.OpenActiveDisplay(
            sim_file_path,
            NXOpen.DisplayPartOption.AllowAdditional
        )

        workSimPart = theSession.Parts.BaseWork
        partLoadStatus1.Dispose()

        # Switch to simulation application
        theSession.ApplicationSwitchImmediate("UG_APP_SFEM")

        simPart1 = workSimPart
        theSession.Post.UpdateUserGroupsFromSimPart(simPart1)

        # Solve the simulation directly
        print("[JOURNAL] Starting solve...")
        markId3 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Start")
        theSession.SetUndoMarkName(markId3, "Solve Dialog")

        markId5 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Solve")

        theCAESimSolveManager = NXOpen.CAE.SimSolveManager.GetSimSolveManager(theSession)

        # Get the first solution from the simulation
        simSimulation1 = workSimPart.FindObject("Simulation")
        simSolution1 = simSimulation1.FindObject("Solution[Solution 1]")

        solution_solves = [simSolution1]

        print("[JOURNAL] Submitting solve...")
        theCAESimSolveManager.SubmitSolves(solution_solves)

        theSession.DeleteUndoMark(markId5, "Solve")

        print("[JOURNAL] Solve submitted successfully!")
        return True

    except Exception as e:
        print(f"[JOURNAL] ERROR: {e}")
        import traceback
        traceback.print_exc()
        return False


if __name__ == '__main__':
    success = main(sys.argv[1:])
    sys.exit(0 if success else 1)
