<?php

declare(strict_types=1);

// Read-only tokenizer scan: top-level second argument of candidate write calls.
$root = $argv[1] ?? '';
if ($root === '' || !is_dir($root)) {
    fwrite(STDERR, "usage: php scan_replace_flags.php <Store application directory>\n");
    exit(2);
}
$methods = ['add' => true, 'addAll' => true, 'insert' => true,
    'insertAll' => true, 'insertGetId' => true];
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($root));
foreach ($iterator as $file) {
    if (!$file->isFile() || substr($file->getFilename(), -4) !== '.php') continue;
    $tokens = token_get_all((string)file_get_contents($file->getPathname()));
    $number = count($tokens);
    for ($i = 0; $i < $number; $i++) {
        $operator = $tokens[$i];
        if (!is_array($operator) || !in_array($operator[0], [T_OBJECT_OPERATOR, T_DOUBLE_COLON], true)) {
            continue;
        }
        $next = $i + 1;
        while ($next < $number && is_array($tokens[$next])
            && $tokens[$next][0] === T_WHITESPACE) $next++;
        if ($next >= $number || !is_array($tokens[$next])
            || !isset($methods[$tokens[$next][1]])) continue;
        $method = $tokens[$next][1];
        $open = $next + 1;
        while ($open < $number && is_array($tokens[$open])
            && $tokens[$open][0] === T_WHITESPACE) $open++;
        if ($open >= $number || $tokens[$open] !== '(') continue;
        $args = [''];
        $paren = 1;
        $bracket = 0;
        $brace = 0;
        for ($k = $open + 1; $k < $number; $k++) {
            $token = $tokens[$k];
            $part = is_array($token) ? $token[1] : $token;
            if (!is_array($token)) {
                if ($part === '(') $paren++;
                elseif ($part === ')') {
                    $paren--;
                    if ($paren === 0) break;
                } elseif ($part === '[') $bracket++;
                elseif ($part === ']') $bracket--;
                elseif ($part === '{') $brace++;
                elseif ($part === '}') $brace--;
                elseif ($part === ',' && $paren === 1 && $bracket === 0 && $brace === 0) {
                    $args[] = '';
                    continue;
                }
            }
            $args[count($args) - 1] .= $part;
        }
        if (count($args) < 2) continue;
        $second = trim((string)$args[1]);
        if ($second === '' || strtolower($second) === 'false') continue;
        $second = preg_replace('/\s+/', ' ', $second);
        $relative = ltrim(substr($file->getPathname(), strlen($root)), DIRECTORY_SEPARATOR);
        echo json_encode(['file' => $relative, 'line' => $operator[2],
            'method' => $method, 'operator' => $operator[0] === T_DOUBLE_COLON ? '::' : '->',
            'second_arg' => $second], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), PHP_EOL;
    }
}
