package com.lemenzo.gallery.util;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;

public final class PermissionUtils {
    public static final int REQUEST_MEDIA = 4101;

    private PermissionUtils() {}

    private static boolean granted(Context context, String permission) {
        return context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
    }

    public static boolean hasSelectedAccess(Context context) {
        return Build.VERSION.SDK_INT >= 34
                && granted(context, Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED);
    }

    public static boolean canReadImages(Context context) {
        if (Build.VERSION.SDK_INT >= 33) {
            return granted(context, Manifest.permission.READ_MEDIA_IMAGES)
                    || hasSelectedAccess(context);
        }
        return granted(context, Manifest.permission.READ_EXTERNAL_STORAGE);
    }

    public static boolean canReadVideos(Context context) {
        if (Build.VERSION.SDK_INT >= 33) {
            return granted(context, Manifest.permission.READ_MEDIA_VIDEO)
                    || hasSelectedAccess(context);
        }
        return granted(context, Manifest.permission.READ_EXTERNAL_STORAGE);
    }

    public static boolean hasMediaAccess(Context context) {
        return canReadImages(context) || canReadVideos(context);
    }

    public static void requestMediaAccess(Activity activity) {
        if (Build.VERSION.SDK_INT >= 34) {
            activity.requestPermissions(new String[] {
                    Manifest.permission.READ_MEDIA_IMAGES,
                    Manifest.permission.READ_MEDIA_VIDEO,
                    Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED
            }, REQUEST_MEDIA);
        } else if (Build.VERSION.SDK_INT >= 33) {
            activity.requestPermissions(new String[] {
                    Manifest.permission.READ_MEDIA_IMAGES,
                    Manifest.permission.READ_MEDIA_VIDEO
            }, REQUEST_MEDIA);
        } else {
            activity.requestPermissions(new String[] {
                    Manifest.permission.READ_EXTERNAL_STORAGE
            }, REQUEST_MEDIA);
        }
    }
}
