#!/usr/bin/env php

<?php

// Auteur : Cédrix pour a5l.fr
// Projet : scripts-bash/ytdll

// Télécharger les pistes audios ajoutées récemment
// depuis des chaines Youtubes

// Version 2024.07.07-14.31
// Version initiale

/*
Création de la base de données
Linux Debian 12 / PostGres 16

Suivez les instructions suivantes pour créer
votre base de données et tous les éléments
associés.

-- Connectez-vous en tant qu'utilisateur ayant des privilèges suffisants
-- depuis le compte root
sudo su - postgres

-- Modification du fichier pg_hba
nano /etc/postgresql/16/main/ph_hba.conf
-- modifier la ligne
local   all             all                                     peer
-- avec la valeur suivante
local   all             all                                     trust

-- avec le compte root redémarrez postgres
systemctl restart postgresql

-- Connectez-vous en tant qu'utilisateur ayant des privilèges suffisants
-- depuis le compte root
sudo su - postgres

-- Connection au requeteur
psql

-- Créer un nouveau role
CREATE ROLE r_ytdll WITH LOGIN PASSWORD 'changeme';

-- Créer la base de données
CREATE DATABASE b_ytdll OWNER r_ytdll;

-- Connectez-vous à la base de données b_ytdll :
\c b_ytdll

-- Créez un nouveau schéma
CREATE SCHEMA s_ytdll AUTHORIZATION r_ytdll;


-- Accorder tous les privilèges sur le schéma à l'utilisateur
GRANT ALL PRIVILEGES ON SCHEMA s_ytdll TO r_ytdll;

-- Accorder des privilèges sur les tables et séquences existantes et futures
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA s_ytdll TO r_ytdll;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA s_ytdll TO r_ytdll;
ALTER DEFAULT PRIVILEGES IN SCHEMA s_ytdll GRANT ALL PRIVILEGES ON TABLES TO r_ytdll;
ALTER DEFAULT PRIVILEGES IN SCHEMA s_ytdll GRANT ALL PRIVILEGES ON SEQUENCES TO r_ytdll;

-- Schéma s_ytdll par défaut
SET search_path TO s_ytdll;
\d
ALTER ROLE r_ytdll SET search_path TO s_ytdll;
ALTER DATABASE b_ytdll SET search_path TO s_ytdll;


*/



// -- GESTION DES PRE REQUIS --
// Vérifier si l'extension pgsql est chargée
if (!extension_loaded('pgsql')) {
    die("L'extension PHP 'pgsql' n'est pas installée. Veuillez l'installer avant de continuer.\n");
}

// Chemin du HOME
$homeDir = getenv('HOME');

// Configuration de l'autoloader
spl_autoload_register(function ($class) use ($homeDir) {
    $baseDir = $homeDir . '/.local/share/ytdll/lib/';
    $file = $baseDir . str_replace('\\', '/', $class) . '.php';
    
    if (file_exists($file)) {
        require $file;
    }
});


// -- GESTION DE LA CONFIGURATION PRIMAIRE --

function getUserInput($prompt) {
    echo $prompt;
    return trim(fgets(STDIN));
}

function createConfigFile($configPath, $templatePath) {
    // Vérifie si le fichier de configuration existe
    if (!file_exists($configPath)) {
        // Copie le fichier de modèle
        if (!copy($templatePath, $configPath)) {
            die("Échec de la copie du fichier de configuration modèle.\n");
        }

        
        // Demande à l'utilisateur de saisir les valeurs nécessaires
        $databaseHost = getUserInput("Veuillez saisir le host de la base de données : ");
        $databaseName = getUserInput("Veuillez saisir le nom de la base de données : ");
        $databaseUser = getUserInput("Veuillez saisir l'utilisateur de la base de données : ");
        $databasePassword = getUserInput("Veuillez saisir le mot de passe de la base de données : ");

        // Lit le fichier de modèle
        $configContent = file_get_contents($configPath);

        // Remplace les valeurs par défaut par les valeurs saisies par l'utilisateur
        $configArray = [
            'database' => [
                'host' => $databaseHost,
                'dbname' => $databaseName,
                'user' => $databaseUser,
                'password' => $databasePassword
            ]
        ];

        // Encode en JSON
        $jsonConfig = json_encode($configArray, JSON_PRETTY_PRINT);

        // Écrit le fichier de configuration JSON
        file_put_contents($configPath, $jsonConfig);
        
        echo "Le fichier de configuration a été créé avec succès.\n";
    }
}

// Appel de la fonction pour créer le fichier de configuration
$configPath = $homeDir . '/.config/fr.a5l.ytdll.json';
$templatePath = $homeDir . '/.local/share/ytdll/config.php';
createConfigFile($configPath, $templatePath);




// -- DEBUT --
// Lit le fichier de configuration primaire
$configContent = file_get_contents($configPath);
// Décode le JSON en tableau associatif
$config = json_decode($configContent, true);
// Initialiser la connexion à la base de données
$database = new Database($config['database']);
unset($config);
// Initialiser au gestionnaire de configuration
$configManager = new Config($database);



// -- GESTION DES VERSIONS de TABLE --
$updateManager = new UpdateManager($configManager, $pdo);
$updateManager->manageVersionTables();