package com.fivemileslab;

import android.util.Log;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;

public class USBPrinterPlugin extends CordovaPlugin {
    private static final String TAG = "USBPrinterPlugin";
    private USBPrinterHelper printerHelper;

    @Override
    protected void pluginInitialize() {
        super.pluginInitialize();
        Log.d(TAG, "USBPrinter plugin initialized");
        printerHelper = new USBPrinterHelper(this.cordova.getActivity().getApplicationContext());
    }

    @Override
    public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
        Log.d(TAG, "Executing action: " + action);

        switch (action) {
            case "init":
                init(callbackContext);
                return true;

            case "print":
                String imageData = args.optString(0, "");
                print(imageData, callbackContext);
                return true;

            case "close":
                close(callbackContext);
                return true;

            default:
                callbackContext.error("Unknown action: " + action);
                return false;
        }
    }

    private void init(final CallbackContext callbackContext) {
        cordova.getThreadPool().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    printerHelper.requestPermission(new USBPrinterHelper.PermissionCallback() {
                        @Override
                        public void onSuccess() {
                            Log.d(TAG, "USB printer initialized successfully");
                            callbackContext.success("USB printer initialized successfully");
                        }

                        @Override
                        public void onError(String message) {
                            Log.e(TAG, "USB printer init failed: " + message);
                            callbackContext.error(message);
                        }
                    });
                } catch (Exception e) {
                    Log.e(TAG, "USB printer init exception: " + e.getMessage(), e);
                    callbackContext.error("USB printer init exception: " + e.getMessage());
                }
            }
        });
    }

    private void print(final String imageData, final CallbackContext callbackContext) {
        cordova.getThreadPool().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    printerHelper.printImage(imageData, new USBPrinterHelper.PrintCallback() {
                        @Override
                        public void onSuccess(String message) {
                            Log.d(TAG, "Print success: " + message);
                            callbackContext.success(message);
                        }

                        @Override
                        public void onError(String message) {
                            Log.e(TAG, "Print error: " + message);
                            callbackContext.error(message);
                        }
                    });
                } catch (Exception e) {
                    Log.e(TAG, "Print exception: " + e.getMessage(), e);
                    callbackContext.error("Print exception: " + e.getMessage());
                }
            }
        });
    }

    private void close(CallbackContext callbackContext) {
        printerHelper.close();
        callbackContext.success("USB printer connection closed");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (printerHelper != null) {
            printerHelper.close();
        }
    }
}