/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
 */

package brotli4cj

class Context {

    static let LOOKUP = Array<Int32>(2048) { _ => 0 }

    private static let UTF_MAP = "         !!  !                  \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# "

    private static let UTF_RLE = "A/*  ':  & : $  \u{0081} @"

    private static func unpackLookupTable(lookup: Array<Int32>, map: String, rle: String): Unit {
        for (i in 0..256) {
            lookup[i] = Int32(i & 0x3F)
            lookup[512 + i] = Int32(i >> 2)
            lookup[1792 + i] = Int32(2 + (i >> 6))
        }
        for (i in 0..128) {
            lookup[1024 + i] = 4 * (Int32(((map[Int64(i)]))) - 32)
        }
        for (i in 0..64) {
            lookup[1152 + i] = Int32(i & 1)
            lookup[1216 + i] = Int32(2 + (i & 1))
        }
        var offset = 1280
        var rleArray = rle.toArray()
        var newRleArray = Utils.changeSourceArray(rleArray)
        for (k in 0..19) {
            let value: Int32 = Int32(k & 3)
            let rep = Int32(UInt64((newRleArray[Int64(k)]))) - 32
            for (i in 0..rep) {
                lookup[offset] = value
                offset++
            }
        }
        for (i in 0..16) {
            lookup[1792 + i] = 1
            lookup[2032 + i] = 6
        }
        lookup[1792] = 0
        lookup[2047] = 7
        for (i in 0..256) {
            lookup[1536 + i] = lookup[1792 + i] << 3
        }
    }

    static init() {
        unpackLookupTable(LOOKUP, UTF_MAP, UTF_RLE)
    }
}