<?php

namespace App\Helpers\Utility;
use Illuminate\Support\Str;

class SymObsfucate {

    private static function getDayKey($salt): string
    {
        return $salt . (string) (int) floor(time() / 86400);
    }

    private static function xorString(string $data, string $key): string
    {
        $result = '';
        $keyLen = strlen($key);
        for ($i = 0, $len = strlen($data); $i < $len; $i++) {
            $result .= chr(ord($data[$i]) ^ ord($key[$i % $keyLen]));
        }
        return $result;
    }

    private static function injectNoise(string $data, string $noise): string
    {
        $result = '';
        for ($i = 0, $len = strlen($data); $i < $len; $i++) {
            $result .= $data[$i];
            if (($i + 1) % $noise === 0) {
                $result .= "\xA3";
            }
        }
        return $result;
    }

    public static function obsfucate(string|array $message, string $salt, int $noise, int $passes = 1, bool $flip = false)
    {
        $altered_message = json_encode($message);

        for($i = 0; $i < $passes; ++$i) {
            $rotated = $flip ? Str::reverse(str_rot13($altered_message)) : $altered_message;
            $altered_message = base64_encode(self::injectNoise(self::xorString(str_rot13($rotated), self::getDayKey($salt)), $noise + $i));
        }

        return $altered_message;
    }

}