using SWRIS.Enums;
using System;
using System.Collections.Generic;

namespace SWRIS.Models
{
    public class FaultDataModel
    {
        /// <summary>
        /// 故障类型
        /// </summary>
        public FaultType FaultType { get; set; }
        /// <summary>
        /// 故障代码
        /// </summary>
        public int FaultCode { get; set; }
        /// <summary>
        /// 是否有故障
        /// </summary>
        public bool HasFault => FaultCode != 0;
        /// <summary>
        /// 在用传感器编号列表
        /// </summary>
        public int[] WorkingSensors => GetWorkingSensors(FaultCode);
        /// <summary>
        /// 故障传感器编号列表
        /// </summary>
        public int[] FaultySensors => GetFaultySensors(FaultCode);

        public override string ToString()
        {
            if (!HasFault)
                return null;

            if (FaultType == FaultType.Encoder)
            {
                return $"编码器故障";
            }
            else
            {
                if (FaultySensors.Length == 0)
                    return null;
                else
                    return $"第[{string.Join(",", FaultySensors)}]路传感器故障";
            }
        }

        /// <summary>
        /// 根据故障码，返回无故障的传感器编号数组
        /// </summary>
        /// <param name="faultCode">故障码 (0/1/2/4/8 或它们的组合)</param>
        /// <returns>无故障的传感器编号数组，如 [1,2,3,4] 表示全正常</returns>
        private static int[] GetWorkingSensors(int faultCode)
        {
            var workingList = new List<int>();

            // 检查每一位，1 左移 (i-1) 位
            for (int i = 1; i <= 4; i++)
            {
                int bitMask = 1 << (i - 1);  // 第i路对应的位掩码：1,2,4,8
                if ((faultCode & bitMask) == 0)
                {
                    workingList.Add(i);  // 该位为0，表示无故障
                }
            }

            return workingList.ToArray();
        }

        /// <summary>
        /// 根据故障码，返回故障的传感器编号数组
        /// </summary>
        /// <param name="faultCode">故障码 (0/1/2/4/8 或它们的组合)</param>
        /// <returns>故障的传感器编号数组，如 [] 表示全正常，[4] 表示第4路故障</returns>
        private static int[] GetFaultySensors(int faultCode)
        {
            var faultyList = new List<int>();

            for (int i = 1; i <= 4; i++)
            {
                int bitMask = 1 << (i - 1);  // 第i路对应的位掩码：1,2,4,8
                if ((faultCode & bitMask) != 0)  // 这里改为 != 0
                {
                    faultyList.Add(i);  // 该位为1，表示有故障
                }
            }

            return faultyList.ToArray();
        }
    }
}
