<?php
/**
 * Tests unitaires pour la classe SimpleAPICache (includes/simple-cache.php).
 *
 * Le répertoire de cache est redirigé vers un dossier temporaire via
 * réflexion afin de ne jamais toucher au cache réel (cache/api).
 */

$cache = new SimpleAPICache();
$cacheDirProperty = new ReflectionProperty(SimpleAPICache::class, 'cacheDir');
$cacheDirProperty->setAccessible(true);

$tmpDir = sys_get_temp_dir() . '/annu-kute-cache-test-' . getmypid();
if (!is_dir($tmpDir)) {
    mkdir($tmpDir, 0755, true);
}
$cacheDirProperty->setValue($cache, $tmpDir);

// --- get sur un cache vide --------------------------------------------------

assertNull($cache->get('videos'), 'get retourne null quand aucune entrée n\'existe');

// --- set puis get -----------------------------------------------------------

$content = ['data' => ['video1', 'video2']];
$cache->set('videos', ['count' => 6], $content);
assertEquals($content, $cache->get('videos', ['count' => 6]), 'get retourne le contenu après set');

// Le fichier stocké contient bien content / expires / created
$files = glob($tmpDir . '/cache_*.json');
assertEquals(1, count($files), 'set crée exactement un fichier de cache');
$stored = json_decode(file_get_contents($files[0]), true);
assertEquals($content, $stored['content'], 'le fichier stocke le contenu sous la clé "content"');
assertTrue(isset($stored['expires']) && $stored['expires'] > time(), 'le fichier stocke une expiration future');
assertTrue(isset($stored['created']), 'le fichier stocke la date de création');

// --- Ordre des paramètres ---------------------------------------------------

// ksort() dans getCacheKey : l'ordre des paramètres ne change pas la clé
$cache->set('videos', ['b' => 2, 'a' => 1], 'ordonné');
assertEquals(
    'ordonné',
    $cache->get('videos', ['a' => 1, 'b' => 2]),
    'get retrouve l\'entrée malgré un ordre de paramètres différent'
);
assertNull(
    $cache->get('videos', ['a' => 9]),
    'get retourne null pour des paramètres différents'
);

// --- Expiration -------------------------------------------------------------

$cache->set('videos', ['old' => 1], 'périmé', -1); // TTL négatif : déjà expiré
$filesBefore = count(glob($tmpDir . '/cache_*.json'));
assertNull($cache->get('videos', ['old' => 1]), 'get retourne null pour une entrée expirée');
assertEquals(
    $filesBefore - 1,
    count(glob($tmpDir . '/cache_*.json')),
    'get supprime le fichier expiré'
);

// --- cleanup ----------------------------------------------------------------

$cache->set('cle-valide', [], 'valide', 300);
$cache->set('cle-perimee', [], 'périmée', -10);
$cleaned = $cache->cleanup();
assertEquals(1, $cleaned, 'cleanup supprime uniquement les entrées expirées');
assertEquals('valide', $cache->get('cle-valide'), 'cleanup conserve les entrées valides');
assertNull($cache->get('cle-perimee'), 'cleanup a bien supprimé l\'entrée expirée');

// --- Nettoyage du dossier temporaire ----------------------------------------

foreach (glob($tmpDir . '/cache_*.json') as $file) {
    unlink($file);
}
rmdir($tmpDir);
