package com.parentalmonitor.child.api;

import android.content.Context;
import android.content.SharedPreferences;
import org.json.JSONObject;
import java.io.*;
import java.net.*;
import java.util.concurrent.*;

public class ApiClient {
    private static final String BASE_URL = "https://wabot.mypersonalwork.online/backend";
    private static ApiClient instance;
    private final Context context;
    private final ExecutorService executor = Executors.newFixedThreadPool(4);

    private ApiClient(Context ctx) { this.context = ctx.getApplicationContext(); }

    public static synchronized ApiClient getInstance(Context ctx) {
        if (instance == null) instance = new ApiClient(ctx);
        return instance;
    }

    private String getToken() {
        return context.getSharedPreferences("auth", Context.MODE_PRIVATE).getString("access_token", "");
    }

    public void setToken(String token, String refresh) {
        context.getSharedPreferences("auth", Context.MODE_PRIVATE).edit()
            .putString("access_token", token).putString("refresh_token", refresh).apply();
    }

    public int getDeviceId() {
        return context.getSharedPreferences("auth", Context.MODE_PRIVATE).getInt("device_id", 0);
    }

    public void setDeviceId(int id) {
        context.getSharedPreferences("auth", Context.MODE_PRIVATE).edit().putInt("device_id", id).apply();
    }

    public JSONObject post(String endpoint, JSONObject data) {
        try {
            URL url = new URL(BASE_URL + endpoint);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            String token = getToken();
            if (!token.isEmpty()) conn.setRequestProperty("Authorization", "Bearer " + token);
            conn.setDoOutput(true);
            conn.setConnectTimeout(15000);
            conn.setReadTimeout(15000);
            OutputStream os = conn.getOutputStream();
            os.write(data.toString().getBytes("UTF-8"));
            os.close();
            return readResponse(conn);
        } catch (Exception e) {
            try { return new JSONObject().put("success", false).put("message", e.getMessage()); }
            catch (Exception ex) { return new JSONObject(); }
        }
    }

    public JSONObject get(String endpoint) {
        try {
            URL url = new URL(BASE_URL + endpoint);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            String token = getToken();
            if (!token.isEmpty()) conn.setRequestProperty("Authorization", "Bearer " + token);
            conn.setConnectTimeout(15000);
            conn.setReadTimeout(15000);
            return readResponse(conn);
        } catch (Exception e) {
            try { return new JSONObject().put("success", false).put("message", e.getMessage()); }
            catch (Exception ex) { return new JSONObject(); }
        }
    }

    private JSONObject readResponse(HttpURLConnection conn) throws Exception {
        int code = conn.getResponseCode();
        InputStream is = code >= 400 ? conn.getErrorStream() : conn.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) sb.append(line);
        br.close();
        return new JSONObject(sb.toString());
    }

    public void postAsync(String endpoint, JSONObject data, ApiCallback cb) {
        executor.execute(() -> {
            JSONObject result = post(endpoint, data);
            if (cb != null) cb.onResult(result);
        });
    }

    public interface ApiCallback { void onResult(JSONObject result); }
}
