<?php
namespace App\Controllers;

use App\Core\Auth;
use App\Core\Controller;
use App\Core\Database;
use App\Core\MobileLicenseManager;
use PDO;

class MobileLicensesController extends Controller
{
    public function index(): void
    {
        if (!Auth::check()) { $this->redirect('/login'); }
        Auth::requireRole(['admin']);

        $pdo = Database::pdo();
        MobileLicenseManager::ensureSchema($pdo);

        $search = trim((string)($_GET['q'] ?? ''));

        $licenses = MobileLicenseManager::listLicenses($pdo, $search);
        $events = MobileLicenseManager::listRecentEvents($pdo, 60, $search);

        $flash = $_SESSION['mobile_license_flash'] ?? null;
        unset($_SESSION['mobile_license_flash']);

        $this->view('settings/mobile_licenses', [
            'licenses' => $licenses,
            'events' => $events,
            'flash' => $flash,
            'search' => $search,
        ]);
    }

    public function generate(): void
    {
        if (!Auth::check()) { $this->redirect('/login'); }
        Auth::requireRole(['admin']);
        if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { $this->redirect('/mobile-licenses'); }

        $userId = (int)($_POST['user_id'] ?? 0);
        $pdo = Database::pdo();

        $stmt = $pdo->prepare('SELECT id, name, email, active FROM users WHERE id = ? LIMIT 1');
        $stmt->execute([$userId]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$user || (int)($user['active'] ?? 0) !== 1) {
            $this->flash('error', 'Utilisateur introuvable ou inactif.');
            $this->redirect('/mobile-licenses');
        }

        try {
            $generated = MobileLicenseManager::generateActivationCode($pdo, $user, (int)(Auth::user()['id'] ?? 0));
            $mailSent = MobileLicenseManager::sendActivationCodeEmail($pdo, $user, $generated['code']);
            $message = $mailSent
                ? 'Code généré et envoyé par email.'
                : 'Code généré, mais l\'email n\'a pas pu être envoyé.';
            $this->flash($mailSent ? 'success' : 'warning', $message, [
                'code' => $generated['code'],
                'user_name' => $user['name'] ?? $user['email'],
                'expires_at' => $generated['expires_at'],
            ]);
        } catch (\Throwable $e) {
            $this->flash('error', 'Impossible de générer le code d\'activation.');
        }

        $this->redirect('/mobile-licenses');
    }

    public function toggle(): void
    {
        if (!Auth::check()) { $this->redirect('/login'); }
        Auth::requireRole(['admin']);
        if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { $this->redirect('/mobile-licenses'); }

        $userId = (int)($_POST['user_id'] ?? 0);
        $enabled = (int)($_POST['enabled'] ?? 0) === 1;

        $pdo = Database::pdo();
        $stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE id = ? LIMIT 1');
        $stmt->execute([$userId]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);
        if (!$user) {
            $this->flash('error', 'Utilisateur introuvable.');
            $this->redirect('/mobile-licenses');
        }

        MobileLicenseManager::ensureUserLicense($pdo, $user);
        MobileLicenseManager::setLicenseEnabled($pdo, $userId, $enabled, (int)(Auth::user()['id'] ?? 0));
        $this->flash('success', $enabled ? 'Licence mobile activée.' : 'Licence mobile suspendue.');
        $this->redirect('/mobile-licenses');
    }

    private function flash(string $type, string $message, array $extra = []): void
    {
        $_SESSION['mobile_license_flash'] = array_merge([
            'type' => $type,
            'message' => $message,
        ], $extra);
    }
}