package com.lemenzo.gallery.loader;

import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.ImageView;

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public final class ImageLoader {
    private static final String TAG = "LemenzoGalleryImage";

    private final Context context;
    private final ExecutorService executor = Executors.newSingleThreadExecutor();
    private final Handler main = new Handler(Looper.getMainLooper());

    public ImageLoader(Context context) {
        this.context = context.getApplicationContext();
    }

    public void load(ImageView view, Uri uri, int width, int height) {
        String key = uri.toString();
        view.setTag(key);

        executor.execute(() -> {
            try {
                Bitmap bitmap = BitmapDecodeUtils.decode(
                        context.getContentResolver(),
                        uri,
                        width,
                        height
                );

                main.post(() -> {
                    if (key.equals(view.getTag())) {
                        view.setImageBitmap(bitmap);
                    }
                });
            } catch (SecurityException securityException) {
                Log.w(
                        TAG,
                        "Image permission denied for " + uri,
                        securityException
                );
            } catch (IOException ioException) {
                Log.e(
                        TAG,
                        "Unable to read image " + uri,
                        ioException
                );
            } catch (RuntimeException runtimeException) {
                Log.e(
                        TAG,
                        "Unable to decode image " + uri,
                        runtimeException
                );
            }
        });
    }

    public void close() {
        executor.shutdownNow();
    }
}
