namespace ZB.MOM.WW.ScadaBridge.Commons.Messages.Management;

// Skip/Take are additive offset paging (arch-review P2). Take = null preserves the
// historical unpaged behaviour (unlimited), so existing callers/UI are untouched.
public record ListTemplatesCommand(int Skip = 0, int? Take = null);
public record GetTemplateCommand(int TemplateId);
public record CreateTemplateCommand(string Name, string? Description, int? ParentTemplateId);

/// <summary>
/// Updates a template. Optional fields use leave-unchanged semantics:
/// a <c>null</c> <see cref="Description"/> keeps the stored description (pass an empty
/// string to clear it), and a <c>null</c> <see cref="ParentTemplateId"/> keeps the
/// existing parent (the parent is immutable; a non-null value that differs is rejected).
/// </summary>
public record UpdateTemplateCommand(int TemplateId, string Name, string? Description, int? ParentTemplateId);
public record DeleteTemplateCommand(int TemplateId);
public record ValidateTemplateCommand(int TemplateId);

/// <summary>
/// Read-only authoring query: returns the EFFECTIVE inherited member
/// set for a template — computed fresh from the full inheritance chain
/// (arbitrary depth), annotated per member with origin + lock state — plus a
/// staleness summary comparing the template's stored rows against the resolved
/// set. Feeds the template editor's inheritance preview + base-change banner;
/// never mutates stored rows. Response: <see cref="ResolvedTemplateMembers"/>.
/// </summary>
public record GetResolvedTemplateMembersCommand(int TemplateId);

/// <summary>
/// Reconciles a template's STORED inherited member rows with the resolved
/// effective inherited set, for the template and its whole derived subtree:
/// materializes missing inherited placeholders (e.g. base members added after a
/// derived template was created), re-syncs drifted placeholders to the live
/// effective value, and removes orphaned inherited rows. After a resync the
/// editor's editable member tabs are complete and the "base changed" staleness
/// banner clears. Designer-gated, audited. Response:
/// <see cref="ResyncInheritedMembersResult"/>.
/// </summary>
public record ResyncInheritedMembersCommand(int TemplateId);

// Template member operations
public record AddTemplateAttributeCommand(int TemplateId, string Name, string DataType, string? Value, string? Description, string? DataSourceReference, bool IsLocked, string? ElementDataType = null);
public record UpdateTemplateAttributeCommand(int AttributeId, string Name, string DataType, string? Value, string? Description, string? DataSourceReference, bool IsLocked, string? ElementDataType = null);
public record DeleteTemplateAttributeCommand(int AttributeId);
public record AddTemplateAlarmCommand(int TemplateId, string Name, string TriggerType, int PriorityLevel, string? Description, string? TriggerConfiguration, bool IsLocked);
public record UpdateTemplateAlarmCommand(int AlarmId, string Name, string TriggerType, int PriorityLevel, string? Description, string? TriggerConfiguration, bool IsLocked);
public record DeleteTemplateAlarmCommand(int AlarmId);
// Native alarm source bindings (read-only mirror of an OPC UA A&C / MxGateway source's alarms)
public record AddTemplateNativeAlarmSourceCommand(int TemplateId, string Name, string ConnectionName, string SourceReference, string? ConditionFilter, string? Description, bool IsLocked);
public record UpdateTemplateNativeAlarmSourceCommand(int NativeAlarmSourceId, string Name, string ConnectionName, string SourceReference, string? ConditionFilter, string? Description, bool IsLocked);
public record DeleteTemplateNativeAlarmSourceCommand(int NativeAlarmSourceId);
public record ListTemplateNativeAlarmSourcesCommand(int TemplateId);
// MinTimeBetweenRuns/ExecutionTimeoutSeconds are additive trailing optionals (default null = "unset"):
// MinTimeBetweenRuns mirrors the TemplateScript.MinTimeBetweenRuns TimeSpan throttle/re-fire interval;
// ExecutionTimeoutSeconds mirrors the per-script TemplateScript.ExecutionTimeoutSeconds override (seconds;
// null/non-positive falls back to the site's global default). Both were previously settable only via
// Transport bundle import — these fields close the CLI/UI authoring gap. Additive-only: never reorder.
public record AddTemplateScriptCommand(int TemplateId, string Name, string Code, string? TriggerType, string? TriggerConfiguration, bool IsLocked, string? ParameterDefinitions = null, string? ReturnDefinition = null, TimeSpan? MinTimeBetweenRuns = null, int? ExecutionTimeoutSeconds = null);
public record UpdateTemplateScriptCommand(int ScriptId, string Name, string Code, string? TriggerType, string? TriggerConfiguration, bool IsLocked, string? ParameterDefinitions = null, string? ReturnDefinition = null, TimeSpan? MinTimeBetweenRuns = null, int? ExecutionTimeoutSeconds = null);
public record DeleteTemplateScriptCommand(int ScriptId);
public record AddTemplateCompositionCommand(int TemplateId, string InstanceName, int ComposedTemplateId);
public record DeleteTemplateCompositionCommand(int CompositionId);
