using System.ComponentModel;

namespace StandardScene.Signal.Model
{
    /// <summary>
    /// 磁条管控区一行。仅 MagCar：车在触发点停稳等待，进程按区名排队后发启动。
    /// </summary>
    /// <remarks>
    /// 主键为 <see cref="TriggerSit"/>。同 <see cref="AreaName"/> 的多行绑成一个路口排队。
    /// 区名为空时，该触发点自成一区（兼容旧表）。
    /// 放行时查本行 <see cref="ControlArea"/> 与同区冲突对向线站点的并集当前占用；不用 pending。
    /// <see cref="ControlReleaseStartStop"/> 保留兼容，MagCar 放行走 FASS 1.0 启动指令，不使用该字节。
    /// </remarks>
    [SignalTable("mag-control", "mag-control-areas.json", "磁条管控区", Order = 5)]
    [Category("磁条交管")]
    [DisplayName("管控区配置列表")]
    public class MagControlAreaModel
    {
        /// <summary>管控触发站点。MagCar 到此停稳后进入该区排队。</summary>
        [DisplayName("管控触发站点")]
        public int TriggerSit { get; set; }

        /// <summary>管控区名称。同名多行绑成一个路口；空则本触发点单独成区。</summary>
        [DisplayName("管控区名称")]
        public string AreaName { get; set; } = "";

        /// <summary>
        /// 兼容组。同区里互不干扰的线路填不同组名；会打架的填同组。
        /// 空则与同区其他空组互斥。站点列表有交集时即使组名不同也互斥。
        /// </summary>
        [DisplayName("兼容组")]
        public string CompatGroup { get; set; } = "";

        /// <summary>优先级，数值越大越先放。干道高、支路低。只在冲突线路之间生效。</summary>
        [DisplayName("优先级")]
        public int Priority { get; set; }

        /// <summary>
        /// 等待时长（秒）。同区取最长；≤0 不做插队。只在冲突线路之间生效。
        /// </summary>
        [DisplayName("等待时长")]
        public int WaitSeconds { get; set; }

        /// <summary>本线路路口内部站点，如 <c>10,11</c>。不要把排队触发点写进来。空则回退触发点。</summary>
        [DisplayName("管控区站点列表")]
        public string ControlArea { get; set; } = "";

        /// <summary>本线路区内最多几辆。含占用本行站点的车和与本行冲突的在途车。默认 1。</summary>
        [DisplayName("区内最多几辆")]
        public int ControlCapacity { get; set; } = 1;

        /// <summary>兼容字段，MagCar 放行不使用。</summary>
        [DisplayName("放行后启停字节")]
        public byte ControlReleaseStartStop { get; set; } = 11;

        /// <summary>false 时该条保留在 JSON 里但不生效。</summary>
        [DisplayName("启用")]
        public bool IsUse { get; set; } = true;
    }
}
