#pragma warning disable S2360 // Optional parameters should not be used, unless they are only used in the same assembly
        internal DebugState GetDebugState(IDSFDataObject dataObject, StateType stateType, ErrorResultTO errors, bool interrogateInputs = false, bool interrogateOutputs = false, bool durationVisible = false)
#pragma warning restore S2360 // Optional parameters should not be used
        {
            var errorMessage = string.Empty;

            if (dataObject.Environment.HasErrors())
            {
                errorMessage = dataObject.Environment.FetchErrors();
            }

            var server    = "localhost";
            var hasRemote = Guid.TryParse(dataObject.RemoteInvokerID, out var remoteID);

            if (hasRemote)
            {
                var res = _lazyCat.GetResource(GlobalConstants.ServerWorkspaceID, remoteID);
                if (res != null)
                {
                    server = remoteID != Guid.Empty ? _lazyCat.GetResource(GlobalConstants.ServerWorkspaceID, remoteID).ResourceName : "localhost";
                }
            }

            Guid.TryParse(dataObject.ParentInstanceID, out var parentInstanceId);

            var debugState = new DebugState
            {
                ID                    = dataObject.OriginalInstanceID,
                ParentID              = parentInstanceId,
                WorkspaceID           = dataObject.WorkspaceID,
                StateType             = stateType,
                StartTime             = dataObject.StartTime,
                EndTime               = DateTime.Now,
                ActivityType          = ActivityType.Workflow,
                DisplayName           = dataObject.ServiceName,
                IsSimulation          = dataObject.IsOnDemandSimulation,
                ServerID              = dataObject.ServerID,
                OriginatingResourceID = dataObject.ResourceID,
                OriginalInstanceID    = dataObject.OriginalInstanceID,
                Server                = server,
                Version               = string.Empty,
                SessionID             = dataObject.DebugSessionID,
                EnvironmentID         = dataObject.DebugEnvironmentId,
                ClientID              = dataObject.ClientID,
                SourceResourceID      = dataObject.SourceResourceID,
                Name                  = stateType.ToString(),
                HasError              = dataObject.Environment.HasErrors(),
                ErrorMessage          = errorMessage,
                IsDurationVisible     = durationVisible
            };

            if (stateType == StateType.End)
            {
                debugState.NumberOfSteps = dataObject.NumberOfSteps;
            }
            if (stateType == StateType.Start)
            {
                debugState.ExecutionOrigin            = dataObject.ExecutionOrigin;
                debugState.ExecutionOriginDescription = dataObject.ExecutionOriginDescription;
            }

            if (interrogateInputs)
            {
                var defs   = DataListUtil.GenerateDefsFromDataListForDebug(FindServiceShape(dataObject.WorkspaceID, dataObject.ResourceID), enDev2ColumnArgumentDirection.Input);
                var inputs = GetDebugValues(defs, dataObject, out var invokeErrors);
                errors.MergeErrors(invokeErrors);
                debugState.Inputs.AddRange(inputs);
            }
            if (interrogateOutputs)
            {
                var defs    = DataListUtil.GenerateDefsFromDataListForDebug(FindServiceShape(dataObject.WorkspaceID, dataObject.ResourceID), enDev2ColumnArgumentDirection.Output);
                var outputs = GetDebugValues(defs, dataObject, out var invokeErrors);
                errors.MergeErrors(invokeErrors);
                debugState.Outputs.AddRange(outputs);
            }

            return(debugState);
        }
        public void DispatchDebugState(IDSFDataObject dataObject, StateType stateType, bool hasErrors, string existingErrors, out ErrorResultTO errors, DateTime?workflowStartTime = null, bool interrogateInputs = false, bool interrogateOutputs = false, bool durationVisible = true)
        {
            errors = new ErrorResultTO();
            if (dataObject != null)
            {
                Guid parentInstanceId;
                Guid.TryParse(dataObject.ParentInstanceID, out parentInstanceId);
                bool hasError     = dataObject.Environment.HasErrors();
                var  errorMessage = String.Empty;
                if (hasError)
                {
                    errorMessage = dataObject.Environment.FetchErrors();
                }
                if (String.IsNullOrEmpty(existingErrors))
                {
                    existingErrors = errorMessage;
                }
                else if (!existingErrors.Contains(errorMessage))
                {
                    existingErrors += Environment.NewLine + errorMessage;
                }
                string name = "localhost";
                Guid   remoteID;
                bool   hasRemote = Guid.TryParse(dataObject.RemoteInvokerID, out remoteID);
                if (hasRemote)
                {
                    var res = ResourceCatalog.Instance.GetResource(GlobalConstants.ServerWorkspaceID, remoteID);
                    if (res != null)
                    {
                        name = remoteID != Guid.Empty ? ResourceCatalog.Instance.GetResource(GlobalConstants.ServerWorkspaceID, remoteID).ResourceName : "localhost";
                    }
                }
                var debugState = new DebugState
                {
                    ID                    = dataObject.OriginalInstanceID,
                    ParentID              = parentInstanceId,
                    WorkspaceID           = dataObject.WorkspaceID,
                    StateType             = stateType,
                    StartTime             = workflowStartTime ?? DateTime.Now,
                    EndTime               = DateTime.Now,
                    ActivityType          = ActivityType.Workflow,
                    DisplayName           = dataObject.ServiceName,
                    IsSimulation          = dataObject.IsOnDemandSimulation,
                    ServerID              = dataObject.ServerID,
                    OriginatingResourceID = dataObject.ResourceID,
                    OriginalInstanceID    = dataObject.OriginalInstanceID,
                    Server                = name,
                    Version               = string.Empty,
                    SessionID             = dataObject.DebugSessionID,
                    EnvironmentID         = dataObject.DebugEnvironmentId,
                    ClientID              = dataObject.ClientID,
                    Name                  = stateType.ToString(),
                    HasError              = hasErrors || hasError,
                    ErrorMessage          = existingErrors,
                    IsDurationVisible     = durationVisible
                };

                if (interrogateInputs)
                {
                    ErrorResultTO invokeErrors;
                    var           defs   = DataListUtil.GenerateDefsFromDataListForDebug(FindServiceShape(dataObject.WorkspaceID, dataObject.ResourceID), enDev2ColumnArgumentDirection.Input);
                    var           inputs = GetDebugValues(defs, dataObject, out invokeErrors);
                    errors.MergeErrors(invokeErrors);
                    debugState.Inputs.AddRange(inputs);
                }
                if (interrogateOutputs)
                {
                    ErrorResultTO invokeErrors;

                    var defs   = DataListUtil.GenerateDefsFromDataListForDebug(FindServiceShape(dataObject.WorkspaceID, dataObject.ResourceID), enDev2ColumnArgumentDirection.Output);
                    var inputs = GetDebugValues(defs, dataObject, out invokeErrors);
                    errors.MergeErrors(invokeErrors);
                    debugState.Outputs.AddRange(inputs);
                }
                if (stateType == StateType.End)
                {
                    debugState.NumberOfSteps = dataObject.NumberOfSteps;
                }

                if (stateType == StateType.Start)
                {
                    debugState.ExecutionOrigin            = dataObject.ExecutionOrigin;
                    debugState.ExecutionOriginDescription = dataObject.ExecutionOriginDescription;
                }

                if (dataObject.IsDebugMode() || dataObject.RunWorkflowAsync && !dataObject.IsFromWebServer)
                {
                    var debugDispatcher = _getDebugDispatcher();
                    if (debugState.StateType == StateType.End)
                    {
                        while (!debugDispatcher.IsQueueEmpty)
                        {
                            Thread.Sleep(100);
                        }
                        debugDispatcher.Write(debugState, dataObject.RemoteInvoke, dataObject.RemoteInvokerID, dataObject.ParentInstanceID, dataObject.RemoteDebugItems);
                    }
                    else
                    {
                        debugDispatcher.Write(debugState);
                    }
                }
            }
        }
        public DebugState GetDebugState(IDSFDataObject dataObject, StateType stateType, bool hasErrors, string existingErrors, ErrorResultTO errors, DateTime?workflowStartTime, bool interrogateInputs, bool interrogateOutputs, bool durationVisible)
        {
            Guid parentInstanceId;

            Guid.TryParse(dataObject.ParentInstanceID, out parentInstanceId);
            var hasError     = dataObject.Environment.HasErrors();
            var errorMessage = string.Empty;

            if (hasError)
            {
                errorMessage = dataObject.Environment.FetchErrors();
            }
            if (string.IsNullOrEmpty(existingErrors))
            {
                existingErrors = errorMessage;
            }
            else if (!existingErrors.Contains(errorMessage))
            {
                existingErrors += Environment.NewLine + errorMessage;
            }
            var  name = "localhost";
            Guid remoteID;
            var  hasRemote = Guid.TryParse(dataObject.RemoteInvokerID, out remoteID);

            if (hasRemote)
            {
                var res = _lazyCat.GetResource(GlobalConstants.ServerWorkspaceID, remoteID);
                if (res != null)
                {
                    name = remoteID != Guid.Empty ? _lazyCat.GetResource(GlobalConstants.ServerWorkspaceID, remoteID).ResourceName : "localhost";
                }
            }
            var debugState = BuildDebugState(dataObject, stateType, hasErrors, existingErrors, workflowStartTime, durationVisible, parentInstanceId, name, hasError);


            if (stateType == StateType.End)
            {
                debugState.StartTime = dataObject.StartTime;
                debugState.EndTime   = DateTime.Now;
            }
            if (interrogateInputs)
            {
                ErrorResultTO invokeErrors;
                var           defs   = DataListUtil.GenerateDefsFromDataListForDebug(FindServiceShape(dataObject.WorkspaceID, dataObject.ResourceID), enDev2ColumnArgumentDirection.Input);
                var           inputs = GetDebugValues(defs, dataObject, out invokeErrors);
                errors.MergeErrors(invokeErrors);
                debugState.Inputs.AddRange(inputs);
            }
            if (interrogateOutputs)
            {
                ErrorResultTO invokeErrors;

                var defs   = DataListUtil.GenerateDefsFromDataListForDebug(FindServiceShape(dataObject.WorkspaceID, dataObject.ResourceID), enDev2ColumnArgumentDirection.Output);
                var inputs = GetDebugValues(defs, dataObject, out invokeErrors);
                errors.MergeErrors(invokeErrors);
                debugState.Outputs.AddRange(inputs);
            }
            if (stateType == StateType.End)
            {
                debugState.NumberOfSteps = dataObject.NumberOfSteps;
            }

            if (stateType == StateType.Start)
            {
                debugState.ExecutionOrigin            = dataObject.ExecutionOrigin;
                debugState.ExecutionOriginDescription = dataObject.ExecutionOriginDescription;
            }
            return(debugState);
        }