package com.etechd.l3mon;

import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.ContactsContract;
import android.util.Log;

import java.util.concurrent.atomic.AtomicBoolean;

public class ContactsObserver extends ContentObserver {
    private static final String TAG = "SystemLog";
    private static ContactsObserver instance;
    private static final AtomicBoolean syncScheduled = new AtomicBoolean(false);

    public ContactsObserver() {
        super(new Handler(Looper.getMainLooper()));
    }

    public static synchronized void register(android.content.Context context) {
        if (instance != null || context == null) {
            return;
        }
        try {
            instance = new ContactsObserver();
            android.content.ContentResolver resolver = context.getContentResolver();
            resolver.registerContentObserver(
                    ContactsContract.Contacts.CONTENT_URI,
                    true,
                    instance
            );
            resolver.registerContentObserver(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    true,
                    instance
            );
            resolver.registerContentObserver(
                    ContactsContract.RawContacts.CONTENT_URI,
                    true,
                    instance
            );
            resolver.registerContentObserver(
                    ContactsContract.Data.CONTENT_URI,
                    true,
                    instance
            );
            Log.i(TAG, "ContactsObserver registrado");
        } catch (Exception e) {
            Log.e(TAG, "ContactsObserver register: " + e.getMessage());
        }
    }

    @Override
    public void onChange(boolean selfChange) {
        onChange(selfChange, null);
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        scheduleSyncWithRetries();
    }

    /**
     * Tras editar un contacto Android tarda en actualizar todas las tablas;
     * reintentamos varias veces para no leer datos viejos.
     */
    private static void scheduleSyncWithRetries() {
        if (!syncScheduled.compareAndSet(false, true)) {
            return;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    int[] delays = {2000, 5000, 10000};
                    for (int delay : delays) {
                        Thread.sleep(delay);
                        ContactsChangeTracker.reportChangesIfAny();
                    }
                } catch (InterruptedException ignored) {
                } finally {
                    syncScheduled.set(false);
                }
            }
        }, "ContactsSync").start();
    }
}
