package com.doist.jobschedulercompat.util;

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.BatteryManager;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;

import androidx.annotation.RestrictTo;

import static android.content.Context.CONNECTIVITY_SERVICE;

@SuppressWarnings("deprecation")
@RestrictTo(RestrictTo.Scope.LIBRARY)
public class DeviceUtils {
    public static boolean isCharging(Context context) {
        Bundle extras = getBatteryChangedExtras(context);
        int plugged = extras != null ? extras.getInt(BatteryManager.EXTRA_PLUGGED, 0) : 0;
        return plugged == BatteryManager.BATTERY_PLUGGED_AC
                || plugged == BatteryManager.BATTERY_PLUGGED_USB
                || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
                && plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS);
    }

    public static boolean isBatteryNotLow(Context context) {
        Bundle extras = getBatteryChangedExtras(context);
        int percentage = extras != null ? extras.getInt(BatteryManager.EXTRA_LEVEL, -1)
                / extras.getInt(BatteryManager.EXTRA_SCALE, 100) : 0;
        return percentage > 15;
    }

    @SuppressWarnings({"deprecation", "ConstantConditions"})
    public static boolean isIdle(Context context) {
        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            return powerManager.isDeviceIdleMode() || !powerManager.isInteractive();
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
            return !powerManager.isInteractive();
        } else {
            return !powerManager.isScreenOn();
        }
    }

    public static boolean isStorageNotLow(Context context) {
        Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW));
        return intent == null;
    }

    public static boolean isConnected(Context context) {
        NetworkInfo info = getActiveNetworkInfo(getConnectivityManager(context));
        return info != null && info.isConnected();
    }

    public static boolean isNotRoaming(Context context) {
        NetworkInfo info = getActiveNetworkInfo(getConnectivityManager(context));
        return info != null && info.isConnected() && !info.isRoaming();
    }

    public static boolean isUnmetered(Context context) {
        ConnectivityManager manager = getConnectivityManager(context);
        NetworkInfo info = getActiveNetworkInfo(manager);
        return info != null && info.isConnected() && !manager.isActiveNetworkMetered();
    }

    public static boolean isMetered(Context context) {
        ConnectivityManager manager = getConnectivityManager(context);
        NetworkInfo info = getActiveNetworkInfo(manager);
        return info != null && info.isConnected() && manager.isActiveNetworkMetered();
    }

    private static Bundle getBatteryChangedExtras(Context context) {
        Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        return intent != null ? intent.getExtras() : null;
    }

    private static NetworkInfo getActiveNetworkInfo(ConnectivityManager manager) {
        return manager.getActiveNetworkInfo();
    }

    private static ConnectivityManager getConnectivityManager(Context context) {
        return (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
    }
}