package com.xiaoyudesign.rnupdate;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;

import java.lang.reflect.Field;

public class UpdateModuleImpl {

    public static final String NAME = "RnUpdate";

    /**
     * 获取字段的兼容性方法，尝试带m前缀和不带m前缀的字段名
     * @param clazz 目标类
     * @param fieldName 基础字段名（不带m前缀）
     * @return 找到的字段对象
     * @throws NoSuchFieldException 如果两种命名都找不到字段
     */
    static Field getCompatibleField(Class<?> clazz, String fieldName) throws NoSuchFieldException {
        // 首先尝试带m前缀的字段名
        try {
            return clazz.getDeclaredField("m" + capitalize(fieldName));
        } catch (NoSuchFieldException e) {
            // 如果找不到带m前缀的，尝试不带m前缀的
            try {
                return clazz.getDeclaredField(fieldName);
            } catch (NoSuchFieldException e2) {
                // 如果都找不到，抛出异常并包含两种尝试的信息
                throw new NoSuchFieldException("Field not found with either name: m" + capitalize(fieldName) + " or " + fieldName);
            }
        }
    }

    /**
     * 首字母大写的辅助方法
     */
    private static String capitalize(String str) {
        if (str == null || str.length() == 0) {
            return str;
        }
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }

    /* 发送事件*/
    public static void sendEvent(final ReactApplicationContext mContext, String eventName, WritableMap params) {
        ((ReactContext) mContext).getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName,
                params);
    }

}
