using JiShe.CollectBus.Common.Consts;
using JiShe.CollectBus.Common.Enums;
using JiShe.CollectBus.Common.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace JiShe.CollectBus.Common.Extensions
{
    public class ProtocolConstExtensions
    {
        /// <summary>
        /// 自动获取 ProtocolConst 类中所有下行 Kafka 主题名称
        /// （通过反射筛选 public const string 且字段名以 "EventName" 结尾的常量）
        /// </summary>
        public static List<string> GetAllTopicNamesByIssued()
        {
            List<string> topics = typeof(ProtocolConst)
                .GetFields(BindingFlags.Public | BindingFlags.Static)
                .Where(f =>
                    f.IsLiteral &&
                    !f.IsInitOnly &&
                    f.FieldType == typeof(string) &&
                    f.Name.EndsWith("IssuedEventName")) // 通过命名规则过滤主题字段
                .Select(f => (string)f.GetRawConstantValue()!)
                .ToList();

            return topics;
        }

        /// <summary>
        /// 自动获取 ProtocolConst 类中所有下行 Kafka 主题名称
        /// （通过反射筛选 public const string 且字段名以 "EventName" 结尾的常量）
        /// </summary>
        public static List<string> GetAllTopicNamesByReceived()
        {
            //固定的上报主题
            var topicList = typeof(ProtocolConst)
                .GetFields(BindingFlags.Public | BindingFlags.Static)
                .Where(f =>
                    f.IsLiteral &&
                    !f.IsInitOnly &&
                    f.FieldType == typeof(string) &&
                    f.Name.EndsWith("ReceivedEventName")) // 通过命名规则过滤主题字段
                .Select(f => (string)f.GetRawConstantValue()!)
                .ToList();

            //动态上报主题，需根据协议的AFN功能码动态获取
            var afnList = EnumExtensions.ToNameValueDictionary<AFN>();
            //需要排除的AFN功能码
            var excludeItems = new List<int>() { 6, 7, 8,15 };

            foreach (var item in afnList)
            {
                if (excludeItems.Contains(item.Value))
                {
                    continue;
                }

                topicList.Add(string.Format(ProtocolConst.AFNTopicNameFormat, item.Value.ToString().PadLeft(2, '0')));
            }

            return topicList;
        }
    }
}
