namespace GreenHome.Domain;
///
/// نوع مصرفکننده متصل به رله
///
public enum RelayKind
{
/// سایر / نامشخص
Generic = 0,
/// فن
Fan = 1,
/// هیتر / بخاری
Heater = 2,
/// پمپ آب
WaterPump = 3,
/// مهپاش / رطوبتساز
Humidifier = 4,
/// روشنایی
Light = 5,
/// شیر برقی
Valve = 6
}
///
/// نوع اقدام یک قانون رله
///
public enum RelayAction
{
/// روشن کردن
On = 0,
/// خاموش کردن
Off = 1
}
///
/// رله دستگاه به همراه تنظیمات آن
///
public sealed class DeviceRelay
{
public int Id { get; set; }
public int DeviceSettingsId { get; set; }
public DeviceSettings DeviceSettings { get; set; } = null!;
/// شماره رله (۱ تا RelayCount)
public int RelayIndex { get; set; }
/// نام نمایشی رله (مثلاً فن، هیتر)
public string Name { get; set; } = string.Empty;
/// آیا این رله فعال است؟
public bool IsEnabled { get; set; } = true;
/// نوع مصرفکننده متصل به رله
public RelayKind RelayKind { get; set; } = RelayKind.Generic;
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
/// گروههای شرط روشن/خاموش شدن رله (گروهها با OR ترکیب میشوند)
public ICollection RuleGroups { get; set; } = new List();
}
///
/// یک گروه شرط برای روشن یا خاموش کردن رله.
/// داخل هر گروه شرایط با AND ترکیب میشوند؛ گروههای همعمل با OR.
///
public sealed class RelayRuleGroup
{
public int Id { get; set; }
public int DeviceRelayId { get; set; }
public DeviceRelay DeviceRelay { get; set; } = null!;
/// اقدام: روشن یا خاموش کردن رله
public RelayAction Action { get; set; } = RelayAction.On;
/// برچسب اختیاری گروه (مثلاً «ایمنی»، «خنکسازی») برای استفاده در لاگ/اعلان
public string? Label { get; set; }
/// ترتیب گروهها
public int Order { get; set; }
/// شرایط داخل این گروه (AND)
public ICollection Conditions { get; set; } = new List();
}
///
/// نوع یک شرط رله: سنسوری یا زمانی
///
public enum RelayConditionType
{
Sensor = 0,
Time = 1
}
///
/// یک شرط واحد داخل گروه (سنسوری یا بازه زمانی)
///
public sealed class RelayRuleCondition
{
public int Id { get; set; }
public int RelayRuleGroupId { get; set; }
public RelayRuleGroup RelayRuleGroup { get; set; } = null!;
/// نوع شرط: سنسوری یا زمانی
public RelayConditionType ConditionType { get; set; } = RelayConditionType.Sensor;
// ---- شرط سنسوری ----
/// نوع سنسور: دما، رطوبت، خاک، گاز، نور
public SensorType? SensorType { get; set; }
/// نوع مقایسه: بزرگتر، کوچکتر، بین، خارج از محدوده
public ComparisonType? ComparisonType { get; set; }
/// مقدار عددی اول
public decimal? Value1 { get; set; }
/// مقدار عددی دوم (برای بین و خارج از محدوده)
public decimal? Value2 { get; set; }
// ---- شرط زمانی ----
/// شروع بازه به دقیقه از نیمهشب (۰ تا ۱۴۳۹)
public int? StartMinutes { get; set; }
/// پایان بازه به دقیقه از نیمهشب (۰ تا ۱۴۳۹) — اگر کوچکتر از شروع باشد یعنی از نیمهشب عبور میکند
public int? EndMinutes { get; set; }
/// ترتیب شرایط داخل گروه
public int Order { get; set; }
}