<?php
// Ce script répare les permissions du fichier de base de données

echo '<h1>Réparation des permissions du fichier de base de données</h1>';

// Chemin du fichier de base de données
$dbFile = __DIR__ . '/database/association.db';

// Vérification si le fichier existe
if (!file_exists($dbFile)) {
    echo '<div style="color: red; font-weight: bold;">Le fichier de base de données n\'existe pas!</div>';
    exit;
}

// Information sur le fichier
echo '<h2>Informations sur le fichier</h2>';
echo 'Chemin: ' . $dbFile . '<br>';
echo 'Taille: ' . filesize($dbFile) . ' octets<br>';
echo 'Date de modification: ' . date("Y-m-d H:i:s", filemtime($dbFile)) . '<br>';
echo 'Permissions actuelles: ' . substr(sprintf('%o', fileperms($dbFile)), -4) . '<br>';

// Vérification des permissions
echo '<h2>Vérification des permissions</h2>';
echo 'Lecture: ' . (is_readable($dbFile) ? 'Oui' : 'Non') . '<br>';
echo 'Écriture: ' . (is_writable($dbFile) ? 'Oui' : 'Non') . '<br>';

// Réparation des permissions
echo '<h2>Réparation des permissions</h2>';

// On essaie d'abord de définir les permissions à 0666 (accessible en lecture/écriture pour tous)
if (chmod($dbFile, 0666)) {
    echo 'Permissions modifiées avec succès à 0666<br>';
} else {
    echo 'Échec de la modification des permissions à 0666<br>';
    
    // Si cela échoue, on essaie de changer le propriétaire du fichier
    if (function_exists('posix_getuid')) {
        $user = posix_getpwuid(posix_getuid());
        $user = $user['name'];
    } else {
        $user = getenv('USERNAME') ?: getenv('USER');
    }
    
    // Cette information est seulement à titre informatif, car PHP ne peut pas changer le propriétaire
    // sans privilèges d'administrateur
    echo 'Utilisateur actuel: ' . $user . '<br>';
    echo 'Pour changer le propriétaire, vous devez exécuter la commande suivante en tant qu\'administrateur:<br>';
    echo '<code>chown ' . $user . ' ' . $dbFile . '</code><br>';
}

// Vérification de l'espace disque
echo '<h2>Vérification de l\'espace disque</h2>';
$totalSpace = disk_total_space(dirname($dbFile));
$freeSpace = disk_free_space(dirname($dbFile));
echo 'Espace disque total: ' . round($totalSpace / (1024 * 1024), 2) . ' MB<br>';
echo 'Espace disque libre: ' . round($freeSpace / (1024 * 1024), 2) . ' MB<br>';
echo 'Pourcentage d\'espace libre: ' . round(($freeSpace / $totalSpace) * 100, 2) . '%<br>';

// Suppression des verrous éventuels
echo '<h2>Suppression des verrous SQLite</h2>';
$lockFile = $dbFile . '-shm';
$journalFile = $dbFile . '-wal';

if (file_exists($lockFile)) {
    if (unlink($lockFile)) {
        echo 'Fichier de verrou shm supprimé avec succès<br>';
    } else {
        echo 'Échec de la suppression du fichier de verrou shm<br>';
    }
} else {
    echo 'Aucun fichier de verrou shm trouvé<br>';
}

if (file_exists($journalFile)) {
    if (unlink($journalFile)) {
        echo 'Fichier journal wal supprimé avec succès<br>';
    } else {
        echo 'Échec de la suppression du fichier journal wal<br>';
    }
} else {
    echo 'Aucun fichier journal wal trouvé<br>';
}

// Création d'une nouvelle base de données vide si nécessaire
echo '<h2>Test de création d\'une copie de sauvegarde</h2>';
$backupFile = $dbFile . '.backup';

if (copy($dbFile, $backupFile)) {
    echo 'Copie de sauvegarde créée avec succès: ' . $backupFile . '<br>';
} else {
    echo 'Échec de la création d\'une copie de sauvegarde<br>';
}

// Test d'ouverture et lecture de la base de données
echo '<h2>Test de connexion à la base de données</h2>';
try {
    $db = new PDO('sqlite:' . $dbFile);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Connexion à la base de données réussie<br>';
    
    $query = "SELECT name FROM sqlite_master WHERE type='table'";
    $stmt = $db->query($query);
    $tables = $stmt->fetchAll(PDO::FETCH_COLUMN);
    
    echo 'Tables trouvées dans la base de données:<br>';
    echo '<ul>';
    foreach ($tables as $table) {
        echo '<li>' . $table . '</li>';
    }
    echo '</ul>';
    
    $db = null; // Fermeture explicite de la connexion
} catch (PDOException $e) {
    echo '<div style="color: red; font-weight: bold;">Erreur de connexion: ' . $e->getMessage() . '</div>';
}

echo '<h2>Liens utiles</h2>';
echo '<a href="settings/association.php" class="btn btn-primary">Retourner à la page des paramètres</a> ';
echo '<a href="test-db.php" class="btn btn-info">Exécuter le test de base de données</a>';
?>
