
package com.patriotnative;

import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.wear.remote.interactions.RemoteActivityHelper;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Promise;

import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.Tasks;
import com.google.android.gms.wearable.Node;
import com.google.android.gms.wearable.Wearable;

import java.util.List;
import java.util.concurrent.Executors;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments;

public class PatriotNativeModule extends ReactContextBaseJavaModule {
    private final ReactApplicationContext reactContext;

    public PatriotNativeModule(ReactApplicationContext context) {
        super(context);
        this.reactContext = context;
    }

    @NonNull
    @Override
    public String getName() {
        return "PatriotNative";
    }

    @ReactMethod
    public void installWatchface(String packageName, Promise promise) {
        new Thread(() -> {
            try {
                Task<List<Node>> nodeListTask = Wearable.getNodeClient(reactContext).getConnectedNodes();
                List<Node> nodes = Tasks.await(nodeListTask);

                if (nodes.isEmpty()) {
                    showToast("Watch not connected");
                    promise.reject("NO_NODES", "No connected WearOS device found.");
                    return;
                }

                for (Node node : nodes) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.addCategory(Intent.CATEGORY_BROWSABLE);
                    intent.setData(Uri.parse("market://details?id=" + packageName));

                    RemoteActivityHelper helper = new RemoteActivityHelper(reactContext, Executors.newSingleThreadExecutor());
                    helper.startRemoteActivity(intent, node.getId());
                }

                showToast("Check your watch");
                promise.resolve(null);
            } catch (Exception e) {
                promise.reject("INSTALL_FAILED", e.getMessage());
            }
        }).start();
    }

    @ReactMethod
    public void getConnectedWatchProperties(Promise promise) {
        Executors.newSingleThreadExecutor().execute(() -> {
            try {
                List<Node> nodes = Tasks.await(Wearable.getNodeClient(reactContext).getConnectedNodes());
                if (nodes == null || nodes.isEmpty()) {
                    WritableMap result = Arguments.createMap();
                    result.putBoolean("isDisconnected", true);
                    promise.resolve(result);
                    return;
                }

                for (Node node : nodes) {
                    String displayName = node.getDisplayName().toLowerCase();

                    // Простой фильтр: часы по ключевым словам
                    if (displayName.contains("watch") || displayName.contains("fitbit") || displayName.contains("wear")) {
                        WritableMap map = Arguments.createMap();
                        map.putString("id", node.getId());
                        map.putString("displayName", node.getDisplayName());
                        map.putBoolean("isNearby", node.isNearby());
                        map.putString("type", "watch");
                        map.putString("platform", displayName.contains("fitbit") ? "fitbit" : "wearOS");

                        promise.resolve(map);
                        return;
                    }
                }

                // Если ни одно устройство не подошло
                WritableMap result = Arguments.createMap();
                result.putBoolean("isDisconnected", true);
                promise.resolve(result);
            } catch (Exception e) {
                promise.reject("WATCH_DETECTION_FAILED", e.getMessage());
            }
        });
    }


    private void showToast(String msg) {
        new Handler(Looper.getMainLooper()).post(() ->
                Toast.makeText(reactContext, msg, Toast.LENGTH_SHORT).show());
    }
}
