using System.ComponentModel;

namespace StandardScene.Signal.Model
{
    /// <summary>
    /// PLC 机构静态配置，对应反编译 <c>PLCModel</c> 可存档字段。
    /// 读写运行态（当前字节、机构内车号）在 <see cref="StandardScene.Signal.Plc.PlcStationRuntime"/>，不进本类、不进 JSON。
    /// 机构名称不能重复，列表编辑器用 JgName 做主键。
    /// </summary>
    [Category("PLC数据管理")]
    [DisplayName("PLC配置列表(机构名称不能重复)")]
    public class PlcStationModel
    {
        /// <summary>逻辑名，握手点 SignalParams 第一段、Worker 线程名都用它。不能空、不能重复。</summary>
        [DisplayName("机构名称")]
        public string JgName { get; set; } = "";

        /// <summary>西门子 PLC IP。</summary>
        [DisplayName("机构IP")]
        public string Ip { get; set; } = "127.0.0.1";

        /// <summary>S7 端口。填 0 则用进程字段 PlcPort（默认 102）。</summary>
        [DisplayName("端口")]
        public int Port { get; set; } = 102;

        /// <summary>
        /// 读字节地址（PLC→调度：允许进入/离开）。
        /// 支持 <c>DB1.DBB0</c> 或 Hsl 风格 <c>DB1.0</c>。空则跳过读取。
        /// </summary>
        [DisplayName("读地址")]
        public string ReadDb { get; set; } = "";

        /// <summary>
        /// 写字节地址（调度→PLC：进入中/到位/离开中/已离开）。
        /// Worker 会先回读再按需写入。空则跳过写和回读。
        /// </summary>
        [DisplayName("写地址")]
        public string WriteDb { get; set; } = "";

        /// <summary>
        /// 心跳位地址，如 <c>DB1.DBX2.0</c>。
        /// Worker 每拍读当前值再写反码，让 PLC 判断调度进程存活。空则不做心跳。
        /// </summary>
        [DisplayName("写心跳地址")]
        public string HeartDb { get; set; } = "";

        /// <summary>机构进入地标（预留，与老 PLCModel 字段对齐；上线跟车主要用 JgInContains）。</summary>
        [DisplayName("机构进入地标")]
        public int JgInPointId { get; set; }

        /// <summary>
        /// 进入过程包含的站点列表（逗号/分号/空格分隔）。
        /// 上线：写字节=进入中 且车已不在此列表 → 视为到位。
        /// </summary>
        [DisplayName("机构进入包含地标")]
        public string JgInContains { get; set; } = "";

        /// <summary>
        /// 机构工作地标。下线 RequestIn 用它查「机构内是否已有车」；
        /// 下线/等待通行离站时，车必须停在此点才响应允许离开。
        /// </summary>
        [DisplayName("机构地标")]
        public int JgPointId { get; set; }

        /// <summary>
        /// 机构占用包含的站点列表。车已不在此列表且写字节还不是已离开 → 写已离开。
        /// </summary>
        [DisplayName("机构包含地标")]
        public string JgContains { get; set; } = "";

        /// <summary>上线 / 单牵引下线 / 双牵引下线 / 等待通行，决定 AutoLeave 分支。</summary>
        [DisplayName("上下机构")]
        public SignalLineType LineType { get; set; } = SignalLineType.未知;
    }
}
