"""
RC4/authcode compatible SDK for networkValide.

This is compatible with the platform authcode(raw, "ENCODE", rc4_key).
Sign: md5(encrypted_data + app_key)
"""

import base64
import hashlib
import time


def md5(value: str) -> str:
    return hashlib.md5(value.encode("utf-8")).hexdigest()


def _rc4(data: bytes, key: bytes) -> bytes:
    box = list(range(256))
    rndkey = [key[i % len(key)] for i in range(256)]
    j = 0
    for i in range(256):
        j = (j + box[i] + rndkey[i]) % 256
        box[i], box[j] = box[j], box[i]
    a = j = 0
    out = bytearray()
    for byte in data:
        a = (a + 1) % 256
        j = (j + box[a]) % 256
        box[a], box[j] = box[j], box[a]
        out.append(byte ^ box[(box[a] + box[j]) % 256])
    return bytes(out)


def authcode_encode(raw_data: str, rc4_key: str) -> str:
    key = md5(rc4_key)
    keya = md5(key[:16])
    keyb = md5(key[16:32])
    keyc = md5(str(time.time()))[-4:]
    cryptkey = (keya + md5(keya + keyc)).encode("utf-8")
    payload = ("0000000000" + md5(raw_data + keyb)[:16] + raw_data).encode("utf-8")
    encrypted = _rc4(payload, cryptkey)
    return keyc + base64.b64encode(encrypted).decode("ascii").replace("=", "")


def authcode_decode(msg: str, rc4_key: str) -> str:
    key = md5(rc4_key)
    keya = md5(key[:16])
    keyb = md5(key[16:32])
    keyc = msg[:4]
    cryptkey = (keya + md5(keya + keyc)).encode("utf-8")
    encoded = msg[4:]
    encoded += "=" * ((4 - len(encoded) % 4) % 4)
    result = _rc4(base64.b64decode(encoded), cryptkey).decode("utf-8")
    content = result[26:]
    check = result[10:26]
    if check != md5(content + keyb)[:16]:
        return ""
    return content


def make_sign(data: str, app_key: str) -> str:
    return md5(data + app_key)
