package org.apache.fineract.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.load.model.LazyHeaders;
import com.bumptech.glide.request.target.BitmapImageViewTarget;

import org.apache.fineract.data.local.PreferencesHelper;
import org.apache.fineract.data.remote.BaseUrl;
import org.apache.fineract.data.remote.EndPoints;
import org.apache.fineract.data.remote.FineractInterceptor;


/**
 * @author Rajan Maurya
 *         On 03/08/17.
 */
public class ImageLoaderUtils {

    private Context context;

    PreferencesHelper preferencesHelper;

    public ImageLoaderUtils(Context context) {
        this.context = context;
        preferencesHelper = new PreferencesHelper(context);
    }

    public String buildIdentificationScanCardImageUrl(String customerIdentifier,
            String identificationNumber, String scanIdentifier) {
        return BaseUrl.getDefaultBaseUrl() +
                EndPoints.API_CUSTOMER_PATH + "/customers/"
                + customerIdentifier + "/identifications/"
                + identificationNumber + "/scans/" + scanIdentifier + "/image";
    }

    public String buildCustomerPortraitImageUrl(String customerIdentifier) {
        return BaseUrl.getDefaultBaseUrl() +
                EndPoints.API_CUSTOMER_PATH + "/customers/"
                + customerIdentifier + "/portrait";
    }

    public GlideUrl buildGlideUrl(String imageUrl) {
        return new GlideUrl(imageUrl, new LazyHeaders.Builder()
                .addHeader(FineractInterceptor.HEADER_TENANT,
                        preferencesHelper.getTenantIdentifier())
                .addHeader(FineractInterceptor.HEADER_AUTH, preferencesHelper.getAccessToken())
                .addHeader(FineractInterceptor.HEADER_USER, preferencesHelper.getUserName())
                .build());
    }

    public void loadImage(String imageUrl, final ImageView imageView, Integer placeHolder) {
        Glide.with(context)
                .load(buildGlideUrl(imageUrl))
                .asBitmap()
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .skipMemoryCache(true)
                .placeholder(placeHolder)
                .error(placeHolder)
                .centerCrop()
                .into(new BitmapImageViewTarget(imageView) {
                    @Override
                    protected void setResource(Bitmap result) {
                        // check a valid bitmap is downloaded
                        if (result == null || result.getWidth() == 0) {
                            return;
                        }
                        // set to image view
                        imageView.setImageBitmap(result);
                        imageView.setVisibility(View.VISIBLE);
                    }
                });
    }
}
