<?php

declare(strict_types=1);

namespace App\Core;

use Database;
use Session;
use Response;
use Request;
use PDO;

/**
 * Classe de base pour tous les controllers
 * Fournit des méthodes communes pour l'authentification et les réponses
 */
abstract class Controller {
    protected PDO $db;
    
    public function __construct() {
        $this->db = Database::getInstance();
    }
    
    /**
     * Vérifier que l'utilisateur est authentifié
     */
    protected function requireAuth(): void {
        if (!Session::isAuthenticated()) {
            $this->sendError('Non authentifié', 401);
            exit;
        }
    }
    
    
    /**
     * Récupérer les données JSON de la requête
     */
    protected function getJsonInput(): array {
        return Request::getJson();
    }
    
    /**
     * Envoyer une réponse de succès
     */
    protected function sendSuccess($data = null, int $code = 200): void {
        if ($data === null) {
            Response::json(['status' => 'success'], $code);
        } else {
            Response::json($data, $code);
        }
    }
    
    /**
     * Envoyer une réponse d'erreur
     */
    protected function sendError(string $message, int $code = 500): void {
        Response::json([
            'status' => 'error',
            'message' => $message
        ], $code);
    }
    
    /**
     * Valider qu'un tableau contient les clés requises
     */
    protected function validateRequired(array $data, array $requiredFields): bool {
        foreach ($requiredFields as $field) {
            if (!isset($data[$field]) || $data[$field] === '') {
                $this->sendError("Le champ '$field' est requis", 400);
                return false;
            }
        }
        return true;
    }
    
    /**
     * Nettoyer et valider un ID
     */
    protected function validateId($id): ?int {
        if (!is_numeric($id) || $id <= 0) {
            $this->sendError('ID invalide', 400);
            return null;
        }
        return (int) $id;
    }
}