package com.secuso.privacyfriendlycodescanner.qrscanner.database;

import android.arch.persistence.room.TypeConverter;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;

import com.google.gson.Gson;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.ResultPoint;

import java.io.ByteArrayOutputStream;

/**
 * This class offers type converters for the room database.
 *
 * @see AppDatabase
 *
 * @author Christopher Beckmann
 */
public final class Converters {

    @TypeConverter
    public static String encodeImage(Bitmap bitmap) {
        if(bitmap == null) return null;
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        byte[] byteArray = byteArrayOutputStream.toByteArray();
        return Base64.encodeToString(byteArray, Base64.NO_WRAP);
    }

    @TypeConverter
    public static Bitmap decodeImage(String encodedImage) {
        if(encodedImage == null) return null;
        byte[] decodedBytes = Base64.decode(encodedImage, Base64.NO_WRAP);
        return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
    }

    @TypeConverter
    public static BarcodeFormat fromText(String text) {
        try {
            return BarcodeFormat.valueOf(text);
        } catch (IllegalArgumentException | NullPointerException e) {
            return null;
        }
    }

    @TypeConverter
    public static String fromBarcodeFormat(BarcodeFormat bcf) {
        return bcf.name();
    }

    @TypeConverter
    public static String fromResultPoints(ResultPoint[] rp) {
        Gson gson = new Gson();
        return gson.toJson(rp);
    }

    @TypeConverter
    public static ResultPoint[] convertResultPointFromJson(String jsonString) {
        Gson gson = new Gson();
        return gson.fromJson(jsonString, ResultPoint[].class);
    }

    public static float dpFromPx(final Context context, final float px) {
        return px / context.getResources().getDisplayMetrics().density;
    }

    public static float pxFromDp(final Context context, final float dp) {
        return dp * context.getResources().getDisplayMetrics().density;
    }
}