package com.wmdigit.transfer.converter.decompress;

import androidx.annotation.RequiresApi;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.BitSet;

public class DecompressUtils {
    private static final int MAX_WINDOW_SIZE = 1024;

    private static double log(double d, double d2) {
        return Math.log(d) / Math.log(d2);
    }

    public static int log2Ceil(double d) {
        if (d <= 0.0d) {
            return -1;
        }
        return (int) Math.ceil(log(d, 2.0d));
    }

    @RequiresApi(api = 19)
    public static int decompress(byte[] bArr, byte[] bArr2, int i) {
        short s;
        BitSet valueOf = BitSet.valueOf(bArr2);
        BitSet bitSet = new BitSet(32);
        int i2 = i;
        int i3 = 0;
        short s2 = 0;
        int i4 = 0;
        int i5 = 0;
        while (i3 < i2) {
            boolean bit = getBit(valueOf, i4);
            int i6 = i4 + 1;
            if (!bit) {
                bArr[i3] = getByte(valueOf, i6);
                i4 = i6 + 8;
                s2 = (short) (s2 + 1);
            } else {
                short s3 = -1;
                while (bit) {
                    s3 = (short) (s3 + 1);
                    bit = getBit(valueOf, i6);
                    i6++;
                }
                if (s3 > 0) {
                    bitSet.clear();
                    int i7 = 32 - s3;
                    for (int i8 = 0; i8 < s3; i8++) {
                        bitSet.set(i7 + i8, getBit(valueOf, i6 + i8));
                    }
                    i6 += s3;
                    s = (short) (((short) ((int) (((long) ((short) (1 << s3))) + getNormalLong(bitSet)))) + 1);
                } else {
                    s = 2;
                }
                int log2Ceil = log2Ceil((double) s2);
                bitSet.clear();
                int i9 = 32 - log2Ceil;
                for (int i10 = 0; i10 < log2Ceil; i10++) {
                    bitSet.set(i9 + i10, getBit(valueOf, i6 + i10));
                }
                i4 = i6 + log2Ceil;
                short normalLong = (short) ((int) getNormalLong(bitSet));
                for (short s4 = 0; s4 < s; s4 = (short) (s4 + 1)) {
                    bArr[i3 + s4] = bArr[i5 + normalLong + s4];
                }
                s2 = (short) (s2 + s);
                i3 += s - 1;
            }
            if (s2 > MAX_WINDOW_SIZE) {
                i5 += s2 - 1024;
                s2 = 1024;
            }
            i3++;
        }
        return s2;
    }

    public static boolean getBit(BitSet bitSet, int i) {
        return bitSet.get(((i / 8) * 8) + (7 - (i % 8)));
    }

    public static byte getByte(BitSet bitSet, int i) {
        byte b = 0;
        for (int i2 = 0; i2 < 8; i2++) {
            b = (byte) (b + ((getBit(bitSet, i + i2) ? 1 : 0) << (7 - i2)));
        }
        return b;
    }

    public static long getNormalLong(BitSet bitSet) {
        ByteBuffer order = ByteBuffer.allocate(8).order(ByteOrder.BIG_ENDIAN);
        //TODO 0墙砖了
        order.put((byte) 0).put((byte) 0).put((byte) 0).put((byte) 0).put(getNormalByte(bitSet, 0)).put(getNormalByte(bitSet, 8)).put(getNormalByte(bitSet, 16)).put(getNormalByte(bitSet, 24)).flip();
        return order.getLong();
    }

    public static byte getNormalByte(BitSet bitSet, int i) {
        byte b = 0;
        for (int i2 = 0; i2 < 8; i2++) {
            b = (byte) (b + ((bitSet.get(i + i2) ? 1 : 0) << (7 - i2)));
        }
        return b;
    }

}