<?php
// Outil de maintenance en ligne de commande.
// A lancer depuis un terminal a chaque fois qu'un projet/client est ajoute
// ou que des fichiers JSON (unit, contact, locker, parking, storage) changent :
//
//   php secure/_tools/sync.php
//
// Ce script :
//  1. Parcourt tous les dossiers client a la racine du site.
//  2. Copie/actualise dans secure/_store/ les fichiers JSON dont le nom
//     contient un des mots-cles (unit, unite, contact, locker, parking, storage).
//  3. Genere un token pour chaque nouveau client (les tokens existants
//     ne sont jamais modifies).
//  4. Affiche un resume : fichiers copies + tokens (nouveaux et existants).

if (PHP_SAPI !== 'cli') {
    http_response_code(403);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(['error' => 'CLI only']);
    exit;
}

$root = dirname(__DIR__, 2); // .../datacenter.immersionapp.ca
$secureDir = $root . '/secure';
$storeRoot = $secureDir . '/_store';
$tokensFile = $secureDir . '/_config/tokens.php';

$pattern = '/(unit|unite|contact|locker|parking|storage)/i';
$skipTop = ['secure', '.well-known', 'cgi-bin'];

$tokens = file_exists($tokensFile) ? require $tokensFile : [];

$rii = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($root, FilesystemIterator::SKIP_DOTS)
);

$copiedCount = 0;
$clientsSeen = [];

foreach ($rii as $file) {
    if (!$file->isFile()) continue;
    if (strtolower($file->getExtension()) !== 'json') continue;

    $full = str_replace('\\', '/', $file->getPathname());
    $rel = ltrim(substr($full, strlen($root)), '/');
    $segments = explode('/', $rel);

    $client = $segments[0];
    if (in_array($client, $skipTop, true)) continue;
    if (in_array('vendor', $segments, true)) continue;

    $filename = end($segments);
    if (!preg_match($pattern, $filename)) continue;

    $dirSegments = array_map('strtolower', array_slice($segments, 1, -1));
    $destDir = $storeRoot . '/' . $client . (count($dirSegments) ? '/' . implode('/', $dirSegments) : '');
    if (!is_dir($destDir)) {
        mkdir($destDir, 0755, true);
    }
    $destFile = $destDir . '/' . $filename;

    // Ne recopie que si le fichier est nouveau ou modifie.
    if (!file_exists($destFile) || filemtime($full) > filemtime($destFile)) {
        copy($full, $destFile);
        $copiedCount++;
        echo "Copie : {$rel}\n";
    }

    $clientsSeen[$client] = true;
}

$newTokens = [];
foreach (array_keys($clientsSeen) as $client) {
    if (!isset($tokens[$client])) {
        $secret = bin2hex(random_bytes(16));
        $tokens[$client] = 'immersionAW' . $client . '-' . $secret;
        $newTokens[$client] = $tokens[$client];
    }
}

if ($newTokens) {
    $lines = [];
    $lines[] = "<?php";
    $lines[] = "// Token map: un token secret Bearer par client.";
    $lines[] = "// Chaque token contient le prefixe requis \"immersionAW{client}\", plus un";
    $lines[] = "// suffixe aleatoire pour qu'il ne soit pas devinable a partir du seul nom du client.";
    $lines[] = "return [";
    foreach ($tokens as $client => $token) {
        $lines[] = "    '" . $client . "' => '" . $token . "',";
    }
    $lines[] = "];";
    file_put_contents($tokensFile, implode("\n", $lines) . "\n");
}

echo "\n=== Resume ===\n";
echo "Fichiers copies/actualises : {$copiedCount}\n";

if ($newTokens) {
    echo "\nNouveaux clients detectes (token a utiliser) :\n";
    foreach ($newTokens as $client => $token) {
        echo "  {$client} : {$token}\n";
    }
} else {
    echo "Aucun nouveau client detecte.\n";
}

echo "\nTokens actuels (tous clients) :\n";
foreach ($tokens as $client => $token) {
    echo "  {$client} : {$token}\n";
}
