package com.rdx.auth;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class RDX {
    private static final String API_URL = "https://api.rdxcommunity.qzz.io/rdx/api/key-access/validate";
    private static final ExecutorService executor = Executors.newSingleThreadExecutor();
    private static final Handler mainHandler = new Handler(Looper.getMainLooper());
    private static String appName = "";
    private static String ownerId = "";
    private static String appSecret = "";

    public interface AuthCallback {
        void onSuccess(String message, JSONObject info);
        void onError(String error);
    }

    public static void initialize(Context context, String name, String owner, String secret) {
        appName = name;
        ownerId = owner;
        appSecret = secret;
    }

    public static String getHWID(Context context) {
        String id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
        return (id != null) ? id : "ANDROID_DEVICE_DEFAULT";
    }

    public static void login(final Context context, final String licenseKey, final AuthCallback callback) {
        executor.execute(() -> {
            try {
                URL url = new URL(API_URL);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Type", "application/json");
                conn.setRequestProperty("Accept", "application/json");
                conn.setConnectTimeout(10000);
                conn.setReadTimeout(10000);
                conn.setDoOutput(true);

                JSONObject payload = new JSONObject();
                payload.put("key", licenseKey.trim());
                payload.put("hwid", getHWID(context));
                payload.put("app_id", appName);

                byte[] postData = payload.toString().getBytes(StandardCharsets.UTF_8);
                try (OutputStream os = conn.getOutputStream()) {
                    os.write(postData);
                    os.flush();
                }

                int code = conn.getResponseCode();
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(code >= 200 && code < 300 ? conn.getInputStream() : conn.getErrorStream(), StandardCharsets.UTF_8)
                );
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) sb.append(line);
                reader.close();

                JSONObject res = new JSONObject(sb.toString());
                boolean success = res.optBoolean("success", false);
                String msg = res.optString("message", success ? "Verified" : "Error");

                mainHandler.post(() -> {
                    if (success) {
                        callback.onSuccess(msg, res);
                    } else {
                        callback.onError(msg);
                    }
                });
            } catch (Exception e) {
                mainHandler.post(() -> callback.onError("Connection failed: " + e.getMessage()));
            }
        });
    }
}