<?php

declare(strict_types=1);

namespace App\Controllers;

// Endpoint de régénération clé API agent
// À ajouter dans AdminController.php

// POST /api/admin/agent/regenerer-cle
// Appelé depuis fab.mykollector.com/admin → Ateliers → Régénérer clé API
// La nouvelle clé est retournée UNE SEULE FOIS — non stockable en clair ensuite

// PATCH /api/admin/agent/statut/:atelierId
// Voir statut heartbeat d'un atelier spécifique

// Ces méthodes s'ajoutent à AdminController existant :

trait AgentKeyTrait
{
    /**
     * POST /api/admin/agent/regenerer-cle
     * Génère une nouvelle clé API pour l'agent d'un atelier.
     * L'ancienne clé est révoquée immédiatement.
     * La nouvelle clé est affichée UNE SEULE FOIS.
     */
    public function regenererCleAgent(
        \Psr\Http\Message\ServerRequestInterface $request,
        \Psr\Http\Message\ResponseInterface $response
    ): \Psr\Http\Message\ResponseInterface {
        $guard = $this->requireRole($request, $response, ['admin_fab', 'super_admin']);
        if ($guard) return $guard;

        $user      = $this->getAuthUser($request);
        $body      = (array)$request->getParsedBody();
        $atelierId = (int)($body['atelier_id'] ?? 0);

        if (!$atelierId) {
            return $this->error($response, 'VALIDATION_ERROR', 'atelier_id requis', 400);
        }

        $atelier = \Illuminate\Database\Capsule\Manager::table('ateliers')
            ->where('id', $atelierId)
            ->where('actif', 1)
            ->first();

        if (!$atelier) {
            return $this->error($response, 'NOT_FOUND', 'Atelier introuvable', 404);
        }

        // Générer nouvelle clé — format mko_agent_{32 bytes hex}
        $newKey = 'mko_agent_' . bin2hex(random_bytes(32));

        // Révoquer l'ancienne clé et appliquer la nouvelle
        // Un seul utilisateur agent par atelier (role=operateur_fab avec agent_api_key)
        $agentUser = \Illuminate\Database\Capsule\Manager::table('users')
            ->where('atelier_id', $atelierId)
            ->whereNotNull('agent_api_key')
            ->first();

        if ($agentUser) {
            // Révoquer l'ancienne — l'agent avec l'ancienne clé recevra 401 et s'arrête
            \Illuminate\Database\Capsule\Manager::table('users')
                ->where('id', $agentUser->id)
                ->update(['agent_api_key' => $newKey]);
        } else {
            // Créer un compte agent dédié pour cet atelier
            \Illuminate\Database\Capsule\Manager::table('users')->insert([
                'email'            => 'agent_atelier_' . $atelierId . '@mko.internal',
                'role'             => 'operateur_fab',
                'atelier_id'       => $atelierId,
                'actif'            => 1,
                'agent_api_key'    => $newKey,
                'date_inscription' => date('Y-m-d H:i:s'),
            ]);
        }

        $this->logAudit(
            $user->id,
            'agent_cle_regeneree',
            'atelier',
            $atelierId,
            ['atelier_nom' => $atelier->nom],
            $request
        );

        // La clé est retournée UNE SEULE FOIS — jamais stockée en clair après ça
        return $this->success($response, [
            'atelier_id'  => $atelierId,
            'atelier_nom' => $atelier->nom,
            'api_key'     => $newKey, // Afficher IMMÉDIATEMENT côté client — ne sera plus accessible
            'message'     => 'Clé régénérée. Copiez-la maintenant — elle ne sera plus affichée.',
        ]);
    }
}
