package com.shukria.softpos;

import android.content.res.AssetManager;
import android.util.Base64;
import android.util.Log;

import androidx.annotation.Nullable;

import com.mypinpad.tsdk.api.models.Iso4217Currency;
import com.mypinpad.tsdk.api.models.TransactionParameters;
import com.mypinpad.tsdk.api.models.TransactionType;
import com.mypinpad.tsdk.api.models.authorization.ClientCredentialsGrant;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

public class AssetInjection {
    public static AssetInjection INSTANCE = new AssetInjection();

    volatile public TransactionParameters injectedTransactionParameters = null;

    public void inject(AssetManager assets) {
        JSONObject config = readJsonAssetOrNull(assets, "config.json");
        if (config == null) {
            Log.v("AssetInjection", "no config to inject");
            return;
        }
        try {
            Log.v("AssetInjection", "using config " + config.toString(2));
        } catch (Exception e) {
            Log.e("AssetInjection", "Error logging config", e);
        }

        JSONObject transactionParameters = config.optJSONObject("transaction_parameters");
        if (transactionParameters != null) {
            injectTransactionParameters(transactionParameters);
        }
    }

    private void injectTransactionParameters(JSONObject json) {
        try {
            Long amountOther = json.optLong("amountOther", -1);
            if (amountOther < 0) {
                amountOther = null;
            }
            injectedTransactionParameters = new TransactionParameters(
                    json.optLong("amount", 0L),
                    amountOther,
                    new Iso4217Currency(json.optInt("currency", 554)),
                    TransactionType.PURCHASE, // will change depending on transaction
                    json.optString("rrn", "123456789001"));
        } catch (Exception e) {
            Log.e("AssetInjection", "Error parsing transaction parameters", e);
        }
    }

    @Nullable
    private static JSONObject readJsonAssetOrNull(AssetManager assetManager, String assetName) {
        try (InputStream assetInputStream = assetManager.open(assetName)) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(assetInputStream));
            String fileContents = reader.lines().parallel().collect(Collectors.joining("\n"));
            return new JSONObject(fileContents);
        } catch (Exception e) {
            return null;
        }
    }
}
