using BlazorApp.Models.Canopen;
namespace BlazorApp.Models
{
    public class CanopenDecoder
    {
        public static string GetMeaning(uint id)
        {
            if (id == 0x080) return "SYNC";

            if (id >= 0x081 && id <= 0x0FF)
                return $"EMCY (Node {id - 0x080})";

            if (id >= 0x700 && id <= 0x77F)
                return $"Heartbeat (Node {id - 0x700})";

            if (id >= 0x180 && id <= 0x4FF)
            {
                int pdoIndex = (int)((id - 0x180) / 0x100) + 1;
                int nodeId = (int)(id - (0x180 + (pdoIndex - 1) * 0x100));
                return $"TPDO{pdoIndex} (Node {nodeId})";
            }

            return "Unknown";
        }

        public static string GetValue(uint id, byte[] data, byte length)
        {
            if (id >= 0x180 && id <= 0x4FF)
            {
                int pdoIndex = (int)((id - 0x180) / 0x100) + 1;
                int nodeId = (int)(id - (0x180 + (pdoIndex - 1) * 0x100));

                var decoder = CanopenDeviceRegistry.GetDecoder(nodeId);
                if (decoder != null)
                    return decoder.DecodeTpdo(pdoIndex, data, length);
            }

            if (id >= 0x700 && id <= 0x77F && length >= 1)
                return DecodeNmtState(data[0]);

            return "No Error";
        }

        private static string DecodeNmtState(byte value)
        {
            return value switch
            {
                0x00 => "Boot-up",
                0x04 => "Stopped",
                0x05 => "Operational",
                0x7F => "Pre-operational",
                _ => $"Unknown (0x{value:X2})"
            };
        }
    }
}
