package com.dittomart.meatsbhavan.web;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.webkit.JavascriptInterface;

import com.dittomart.meatsbhavan.R;
import com.dittomart.meatsbhavan.ui.MainActivity;
import com.dittomart.meatsbhavan.util.Constant;
import com.dittomart.meatsbhavan.api.Api;
import com.dittomart.meatsbhavan.ui.ChatActivity;
import com.dittomart.meatsbhavan.util.SharePref;
import com.google.gson.Gson;
import com.razorpay.Checkout;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Iterator;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class WebAppInterface{


    private static final String TAG = "WebAppInterface";
    private final Context context;
    String data;
    private Api apiService;


    public WebAppInterface(Context context,Api apiService){
        this.context = context;
        SharePref pref = new SharePref(context);
        this.apiService = apiService;
    }


    @JavascriptInterface
    public void registerFcm(String token) {
        Log.d(TAG, "registerFcm: "+token);
        SendFcmTokenToServer(token);
    }

    @JavascriptInterface
    public void shareDataThroughIntent(String data){
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("text/plain");
        share.putExtra(Intent.EXTRA_TEXT, data);
        context.startActivity(Intent.createChooser(share, ""));
    }




    @JavascriptInterface
    public void initiateChatForSingleOrder(String userid,String orderId){
        Log.d(TAG, "initiateChatForSingleOrder: "+userid+ orderId);
        Intent intent = new Intent(context, ChatActivity.class);
        intent.putExtra("ORDER_ID",orderId);
        intent.putExtra("USER_ID",userid);
        context.startActivity(intent);
    }

    //Send Jwt token and generated token to Server
    public void SendFcmTokenToServer(String serverToken) {

        String generatedToken = SharePref.getDataFromPref(Constant.FCM_TOKEN);

        Log.d(TAG, "SendFcmTokenToServer: "+serverToken+ "\n Generated Token"+ generatedToken);


        if(!generatedToken.isEmpty()){

            Call<String> tokenCall = apiService.createSend(serverToken,generatedToken);
            tokenCall.enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    Log.d(TAG, "onResponse: "+response.code());
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    Log.d(TAG, "onFailure: "+t.getMessage());
                }
            });
        }

    }

    @JavascriptInterface
    public void requestLocationPermission() {
        Log.d(TAG, "requestLocationPermission called from JavaScript");
        // This method can be called from JavaScript to manually trigger location permission
        // The actual permission handling is done in MyWebChromeClient
    }
    
    @JavascriptInterface
    public void checkLocationPermission() {
        Log.d(TAG, "checkLocationPermission called from JavaScript");
        // Check if location permission is granted
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            int permission = context.checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION);
            boolean hasPermission = (permission == android.content.pm.PackageManager.PERMISSION_GRANTED);
            Log.d(TAG, "Location permission status: " + hasPermission);
            
            // Inject JavaScript to notify the web page about permission status
            if (context instanceof com.dittomart.meatsbhavan.ui.MainActivity) {
                com.dittomart.meatsbhavan.ui.MainActivity activity = (com.dittomart.meatsbhavan.ui.MainActivity) context;
                String jsCode = "if(window.onLocationPermissionChecked) { window.onLocationPermissionChecked(" + hasPermission + "); }";
                activity.runOnUiThread(() -> {
                    if (activity.getWebView() != null) {
                        activity.getWebView().evaluateJavascript(jsCode, null);
                    }
                });
            }
        }
    }
    
    @JavascriptInterface
    public void forceLocationPermission() {
        Log.d(TAG, "forceLocationPermission called from JavaScript - attempting to trigger geolocation");
        // Force trigger geolocation by injecting JavaScript
        if (context instanceof com.dittomart.meatsbhavan.ui.MainActivity) {
            com.dittomart.meatsbhavan.ui.MainActivity activity = (com.dittomart.meatsbhavan.ui.MainActivity) context;
            String jsCode = "if(navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { console.log('Location obtained:', position.coords.latitude, position.coords.longitude); }, function(error) { console.log('Location error:', error.message); }); }";
            activity.runOnUiThread(() -> {
                if (activity.getWebView() != null) {
                    activity.getWebView().evaluateJavascript(jsCode, null);
                }
            });
        }
    }

    @JavascriptInterface
    public void startPayuProcess(String txnId, String amount, String name, String email, String phone) {
        Log.d("PayU>", txnId);
        Constant.UNIQUE_ORDER_ID = txnId;
        ((MainActivity) context).startPayU(txnId, amount, name, email, phone);
    }

    @JavascriptInterface
    public void startRazorpaySdkProcess(String id,String uniqueOrderId,String name,String email,String phone){
        Constant.ID = id;
        Constant.UNIQUE_ORDER_ID = uniqueOrderId;
        Log.d(TAG, "ID: "+id + "UNIQUE ORDER ID: "+uniqueOrderId);
        Log.d(TAG, "startRazorpaySdkProcess: "+SharePref.getDataFromPref("razorpayKeyId"));
        Log.d(TAG, "CurrencyId: "+SharePref.getDataFromPref("currencyId"));
        Log.d(TAG, "Name: "+name);
        Log.d(TAG, "Email: "+email);
        Log.d(TAG, "Phone: "+phone);


        //api call on server to get the razorpay order id

        apiService.createRazorpayOrder(id).enqueue(new Callback<Object>() {
            @Override
            public void onResponse(Call<Object> call, Response<Object> response) {
                if(response.isSuccessful()){
                    String json = new Gson().toJson(response.body());

                    JSONObject jsonObject = null;
                    try {
                        jsonObject = new JSONObject(json.trim());
                        Iterator<String> keys = jsonObject.keys();

                        boolean success = jsonObject.getBoolean("razorpay_success");

                        if(success){
                            jsonObject = new JSONObject(jsonObject.getString("response"));
                            startPayment(jsonObject.getString("id"),name,email,phone);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call<Object> call, Throwable t) {

            }
        });
    }


    private void startPayment(String order_id,String name,String email,String phone) {

        String currencyId =  SharePref.getDataFromPref("currencyId").substring(1, SharePref.getDataFromPref("currencyId").length() - 1);
        String razorpayKeyId =  SharePref.getDataFromPref("razorpayKeyId").substring(1, SharePref.getDataFromPref("razorpayKeyId").length() - 1);
        String storeName =  SharePref.getDataFromPref("storeName").substring(1, SharePref.getDataFromPref("storeName").length() - 1);
        String imageUrl = Constant.BASE_URL.concat("assets/img/favicons/favicon-512x512.png");
        /**
         * Instantiate Checkout
         */
        Checkout checkout = new Checkout();

        checkout.setKeyID(razorpayKeyId);

        /**
         * Set your logo here
         */
//        checkout.setImage(R.drawable.splash);

        /**
         * Reference to current activity
         */
        final Activity activity = (MainActivity) context;

        /**
         * Pass your payment options to the Razorpay Checkout as a JSONObject
         */
        try {
            JSONObject options = new JSONObject();

            options.put("name",storeName );
            options.put("image", imageUrl);
            options.put("order_id", order_id);//from response of step 3.
            options.put("currency", currencyId);
            options.put("prefill.name", name);
            options.put("prefill.email", email);
            options.put("prefill.contact",phone);
            JSONObject retryObj = new JSONObject();
            retryObj.put("enabled", true);
            retryObj.put("max_count", 4);
            options.put("retry", retryObj);

            // Additional options to prevent full screen behavior
            options.put("theme", "light");
            options.put("modal", true);
            options.put("modal_backdrop", true);
            options.put("modal_backdrop_close", true);
            options.put("modal_escape_key", true);
            options.put("modal_click_outside", true);

//            Log.d(TAG, "startPayment:  "+options);
            checkout.open(activity, options);

        } catch(Exception e) {
            Log.e(TAG, "Error in starting Razorpay Checkout", e);
        }
    }

}
