package com.cwbuyer.lib;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.journeyapps.barcodescanner.BarcodeEncoder;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;

/**
 * Utility class for generating barcodes using ZXing library.
 */
public class BarcodeUtil {

    // Default width for the barcode
    private static final int DEFAULT_WIDTH = 600;
    // Default height for the barcode
    private static final int DEFAULT_HEIGHT = 70;
    // Default barcode format
    private static final BarcodeFormat DEFAULT_FORMAT = BarcodeFormat.CODE_128;
    // Padding for the barcode
    private static final int PADDING = 4;

    /**
     * Generates a barcode with default size and format.
     *
     * @param data The data to encode in the barcode.
     * @return A Bitmap representing the generated barcode.
     */
    public static Bitmap generateBarcode(String data) {
        return generateBarcode(data, DEFAULT_FORMAT, DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }

    /**
     * Generates a barcode with custom format and default size.
     *
     * @param data The data to encode in the barcode.
     * @param format The format of the barcode.
     * @return A Bitmap representing the generated barcode.
     */
    public static Bitmap generateBarcode(String data, BarcodeFormat format) {
        return generateBarcode(data, format, DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }

    /**
     * Generates a barcode with custom size and format.
     *
     * @param data The data to encode in the barcode.
     * @param format The format of the barcode.
     * @param width The width of the barcode.
     * @param height The height of the barcode.
     * @return A Bitmap representing the generated barcode.
     */
    public static Bitmap generateBarcode(String data, BarcodeFormat format, int width, int height) {
        BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
        Bitmap bitmap = null;
        try {
            BitMatrix bitMatrix = barcodeEncoder.encode(data, format, width - PADDING, height - PADDING);
            bitmap = barcodeEncoder.createBitmap(bitMatrix);

            // Create a new bitmap with padding
            Bitmap paddedBitmap = Bitmap.createBitmap(width,height, bitmap.getConfig());
            Canvas canvas = new Canvas(paddedBitmap);
            canvas.drawColor(Color.WHITE); // Set the background color to white
            canvas.drawBitmap(bitmap, PADDING, PADDING, null);

            return paddedBitmap;
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return bitmap;
    }
}