package com.ruby.shape;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.facebook.common.executors.CallerThreadExecutor;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
import com.facebook.imagepipeline.image.CloseableImage;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;

import java.util.Observable;

public class Picture extends Shape {
    private Bitmap bitmap;

    public Picture(Context context, ReadableMap map, @NonNull Callback callback) {
        super(map);
        String uri = map.getString("source");
        ImageRequest imageRequest = ImageRequest.fromUri(uri);
        Fresco.getImagePipeline().fetchDecodedImage(imageRequest, context).subscribe(new BaseBitmapDataSubscriber() {
            @Override
            protected void onNewResultImpl(@Nullable Bitmap bitmap) {
                ReadableArray crop = map.getArray("crop");
                if (crop != null && crop.size() == 4) {
                    bitmap = Bitmap.createBitmap(bitmap, crop.getInt(0), crop.getInt(1), crop.getInt(2), crop.getInt(3));
                }
                Picture.this.bitmap = bitmap;
                callback.onLoadBitmapSuccess(bitmap);
            }

            @Override
            protected void onFailureImpl(@NonNull DataSource<CloseableReference<CloseableImage>> dataSource) {
                Picture.this.bitmap = null;
                callback.onLoadBitmapFailure(dataSource.getFailureCause());
            }
        }, CallerThreadExecutor.getInstance());
    }

    public Bitmap getBitmap() {
        return bitmap;
    }

    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }

    @Override
    public void draw(@NonNull Canvas canvas) {
        if (bitmap != null) {
            canvas.drawBitmap(bitmap, null, getBounds(), null);
        }
    }

    public interface Callback {
        void onLoadBitmapSuccess(Bitmap bitmap);

        void onLoadBitmapFailure(Throwable t);
    }
}
