<?php
/**
 * Detailed analysis of the mojibake pattern in app.js
 * Looking at line 12: "ชกฒข ชฒขเนญ" 
 * Hex: e0b88ae0b881c28ae0b892e0b882 20 e0b88ae0b892e0b882c28ae0b980e0b899c289e0b88dc29b
 *
 * Let's break it down character by character
 */

$content = file_get_contents('app.js');
$lines = explode("\n", $content);

// Line 12 (index 11)
$line = $lines[11];
echo "=== Line 12 analysis ===\n";
echo "Content: " . trim($line) . "\n\n";

// Extract just the name part
// Find the name between quotes after name: "
preg_match('/name:\s*"([^"]+)"/', $line, $m);
if ($m) {
    $name = $m[1];
    echo "Extracted name: $name\n";
    echo "Hex: " . bin2hex($name) . "\n";
    echo "Length (bytes): " . strlen($name) . "\n";
    echo "Length (chars): " . mb_strlen($name, 'UTF-8') . "\n\n";
    
    echo "Character by character:\n";
    $pos = 0;
    $charNum = 0;
    while ($pos < strlen($name)) {
        $byte = ord($name[$pos]);
        $charNum++;
        
        if ($byte < 0x80) {
            // ASCII
            $char = $name[$pos];
            $hex = sprintf('%02X', $byte);
            $cp = $byte;
            echo "  Char $charNum: '$char' (U+" . sprintf('%04X', $cp) . ") hex=$hex [ASCII]\n";
            $pos++;
        } elseif (($byte & 0xE0) == 0xC0) {
            // 2-byte UTF-8
            $char = substr($name, $pos, 2);
            $hex = bin2hex($char);
            $cp = mb_ord($char, 'UTF-8');
            echo "  Char $charNum: '" . $char . "' (U+" . sprintf('%04X', $cp) . ") hex=$hex [2-byte UTF-8]\n";
            $pos += 2;
        } elseif (($byte & 0xF0) == 0xE0) {
            // 3-byte UTF-8
            $char = substr($name, $pos, 3);
            $hex = bin2hex($char);
            $cp = mb_ord($char, 'UTF-8');
            echo "  Char $charNum: '" . $char . "' (U+" . sprintf('%04X', $cp) . ") hex=$hex [3-byte UTF-8]\n";
            $pos += 3;
        } elseif (($byte & 0xF8) == 0xF0) {
            // 4-byte UTF-8
            $char = substr($name, $pos, 4);
            $hex = bin2hex($char);
            $cp = mb_ord($char, 'UTF-8');
            echo "  Char $charNum: '" . $char . "' (U+" . sprintf('%04X', $cp) . ") hex=$hex [4-byte UTF-8]\n";
            $pos += 4;
        } else {
            echo "  Char $charNum: INVALID byte " . sprintf('%02X', $byte) . "\n";
            $pos++;
        }
    }
}

// Line 32 (index 31) - category name
echo "\n=== Line 32 analysis ===\n";
$line32 = $lines[31];
preg_match("/name:\s*'([^']+)'/", $line32, $m32);
if ($m32) {
    $catName = $m32[1];
    echo "Extracted category name: $catName\n";
    echo "Hex: " . bin2hex($catName) . "\n\n";
    
    echo "Character by character:\n";
    $pos = 0;
    $charNum = 0;
    while ($pos < strlen($catName)) {
        $byte = ord($catName[$pos]);
        $charNum++;
        
        if ($byte < 0x80) {
            $char = $catName[$pos];
            $cp = $byte;
            echo "  Char $charNum: '$char' (U+" . sprintf('%04X', $cp) . ") [ASCII]\n";
            $pos++;
        } elseif (($byte & 0xE0) == 0xC0) {
            $char = substr($catName, $pos, 2);
            $hex = bin2hex($char);
            $cp = mb_ord($char, 'UTF-8');
            echo "  Char $charNum: '" . $char . "' (U+" . sprintf('%04X', $cp) . ") hex=$hex [2-byte, maps to byte " . sprintf('0x%02X', $cp) . "]\n";
            $pos += 2;
        } elseif (($byte & 0xF0) == 0xE0) {
            $char = substr($catName, $pos, 3);
            $hex = bin2hex($char);
            $cp = mb_ord($char, 'UTF-8');
            echo "  Char $charNum: '" . $char . "' (U+" . sprintf('%04X', $cp) . ") hex=$hex [3-byte Thai]\n";
            $pos += 3;
        } else {
            echo "  Char $charNum: byte " . sprintf('%02X', $byte) . "\n";
            $pos++;
        }
    }
}
