package com.rntensorflow.converter;

import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableNativeArray;

import java.util.ArrayList;
import java.util.List;

public class ArrayConverter {

    public static String[] readableArrayToStringArray(ReadableArray readableArray) {
        String[] arr = new String[readableArray.size()];
        for (int i = 0; i < readableArray.size(); i++) {
            arr[i] = readableArray.getString(i);
        }

        return arr;
    }

    public static double[] readableArrayToDoubleArray(ReadableArray readableArray) {
        double[] arr = new double[readableArray.size()];
        for (int i = 0; i < readableArray.size(); i++) {
            arr[i] = readableArray.getDouble(i);
        }

        return arr;
    }

    public static long[] readableArrayToLongArray(ReadableArray readableArray) {
        long[] arr = new long[readableArray.size()];
        for (int i = 0; i < readableArray.size(); i++) {
            arr[i] = (long)readableArray.getDouble(i);
        }

        return arr;
    }

    public static float[] readableArrayToFloatArray(ReadableArray readableArray) {
        float[] arr = new float[readableArray.size()];
        for (int i = 0; i < readableArray.size(); i++) {
            arr[i] = (float)readableArray.getDouble(i);
        }

        return arr;
    }

    public static int[] readableArrayToIntArray(ReadableArray readableArray) {
        int[] arr = new int[readableArray.size()];
        for (int i = 0; i < readableArray.size(); i++) {
            arr[i] = readableArray.getInt(i);
        }

        return arr;
    }

    public static byte[] readableArrayToByteBoolArray(ReadableArray readableArray) {
        byte[] bytesArr = new byte[readableArray.size() / 8 + 1];
        for (int entry = 0; entry < bytesArr.length; entry++) {
            for (int bit = 0; bit < 8; bit++) {
                if (readableArray.getBoolean(entry * 8 + bit)) {
                    bytesArr[entry] |= (128 >> bit);
                }
            }
        }

        return bytesArr;
    }

    public static byte[] readableArrayToByteStringArray(ReadableArray readableArray) {
        List<Byte> bytes = new ArrayList<>(readableArray.size() * 5);
        for (int i = 0; i < readableArray.size(); i++) {
            for (byte b :readableArray.getString(i).getBytes()) {
                bytes.add(b);
            }
        }

        byte[] bytesArr = new byte[bytes.size()];
        for (int i = 0; i < bytes.size(); i++) {
            bytesArr[i] = bytes.get(i);
        }

        return bytesArr;
    }

    public static ReadableArray doubleArrayToReadableArray(double[] arr) {
        WritableArray writableArray = new WritableNativeArray();
        for (double d : arr) {
            writableArray.pushDouble(d);
        }

        return writableArray;
    }

    public static ReadableArray floatArrayToReadableArray(float[] arr) {
        WritableArray writableArray = new WritableNativeArray();
        for (float f : arr) {
            writableArray.pushDouble(f);
        }

        return writableArray;
    }

    public static ReadableArray intArrayToReadableArray(int[] arr) {
        WritableArray writableArray = new WritableNativeArray();
        for (int i : arr) {
            writableArray.pushInt(i);
        }

        return writableArray;
    }

    public static ReadableArray byteArrayToBoolReadableArray(byte[] arr) {
        WritableArray writableArray = new WritableNativeArray();
        byte[] pos = new byte[]{(byte)0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};

        for(int i = 0; i < arr.length; i++){
            for(int k = 0; k < 8; k++){
                boolean res = (arr[i] & pos[k]) != 0;
                writableArray.pushBoolean(res);
            }
        }

        return writableArray;
    }
}