<?php
// ════════════════════════════════════════════════════════════════
// MyKollectOr® — Patch AdminController
// Méthodes createUser() et updateUser() : persister atelier_id (INT FK)
// + endpoint /api/fab/ateliers pour le <select> du formulaire users.html
//
// 1. Dans AdminController, remplacer createUser() et updateUser() par ceux-ci.
// 2. Ajouter la route /api/fab/ateliers dans FabController (voir bas de fichier).
// ════════════════════════════════════════════════════════════════

// ── Dans AdminController ──────────────────────────────────────

    /**
     * POST /api/admin/users
     * Crée un utilisateur. atelier_id est un INT FK vers ateliers.id.
     */
    public function createUser(Request $request, Response $response): Response
    {
        $user = $this->getAuthUser($request);
        if (!$user || $user->role !== 'super_admin') {
            return $this->error($response, 'FORBIDDEN', 'Réservé au super admin', 403);
        }

        $body = (array)$request->getParsedBody();

        $email    = trim($body['email'] ?? '');
        $prenom   = trim($body['prenom'] ?? '');
        $nom      = trim($body['nom'] ?? '');
        $role     = $body['role'] ?? 'sportif';
        $actif    = isset($body['actif']) ? (int)$body['actif'] : 1;
        // *** atelier_id : INT ou NULL — jamais une chaîne libre ***
        $atelierIdRaw = $body['atelier_id'] ?? null;
        $atelierIdRaw = ($atelierIdRaw !== null && $atelierIdRaw !== '') ? (int)$atelierIdRaw : null;

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

        $rolesAutorises = ['sportif','operateur_fab','admin_fab','admin_chrono','super_admin'];
        if (!in_array($role, $rolesAutorises, true)) {
            return $this->error($response, 'VALIDATION_ERROR', 'Rôle invalide', 400);
        }

        // Valider que l'atelier existe (si fourni)
        if ($atelierIdRaw !== null) {
            $atelierExists = DB::table('ateliers')
                ->where('id', $atelierIdRaw)
                ->where('actif', 1)
                ->exists();
            if (!$atelierExists) {
                return $this->error($response, 'VALIDATION_ERROR', 'Atelier introuvable ou inactif', 422);
            }
        }

        // Email unique
        if (DB::table('users')->where('email', $email)->exists()) {
            return $this->error($response, 'CONFLICT', 'Email déjà utilisé', 409);
        }

        $password = $body['password'] ?? null;
        if (!$password) {
            // Générer un mot de passe temporaire
            $password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789!@#'), 0, 12);
        }
        $hashedPw = password_hash($password, PASSWORD_DEFAULT);

        $newUserId = DB::table('users')->insertGetId([
            'email'            => $email,
            'password'         => $hashedPw,
            'prenom'           => $prenom ?: null,
            'nom'              => $nom    ?: null,
            'role'             => $role,
            'atelier_id'       => $atelierIdRaw,  // ← INT FK
            'actif'            => $actif,
            'date_inscription' => date('Y-m-d H:i:s'),
        ]);

        // Si rôle FAB + atelier lié à un contact_id : s'assurer que la conversation existe
        if (in_array($role, ['operateur_fab', 'admin_fab'], true) && $atelierIdRaw) {
            $this->ensureFabConversation($newUserId, $atelierIdRaw);
        }

        // Envoyer le mail de bienvenue fab si rôle fabricant
        if (in_array($role, ['operateur_fab', 'admin_fab'], true)) {
            try {
                $mail = new \App\Services\MailService();
                $mail->accesFabCree($email, $prenom ?: 'Opérateur', $password);
            } catch (\Exception $e) {
                error_log('[AdminController] Erreur envoi mail accesFabCree: ' . $e->getMessage());
            }
        }

        $this->logAudit($user->id, 'create_user', 'users', $newUserId, ['role' => $role, 'atelier_id' => $atelierIdRaw], $request);

        return $this->success($response, [
            'id'         => $newUserId,
            'email'      => $email,
            'role'       => $role,
            'atelier_id' => $atelierIdRaw,
        ], 201);
    }

    /**
     * PATCH /api/admin/users/{id}
     * Modifie un utilisateur. atelier_id est un INT FK.
     */
    public function updateUser(Request $request, Response $response, array $args): Response
    {
        $user = $this->getAuthUser($request);
        if (!$user || $user->role !== 'super_admin') {
            return $this->error($response, 'FORBIDDEN', 'Réservé au super admin', 403);
        }

        $targetId = (int)$args['id'];
        $body     = (array)$request->getParsedBody();

        $updates = [];

        if (isset($body['prenom']))  $updates['prenom']  = trim($body['prenom']);
        if (isset($body['nom']))     $updates['nom']     = trim($body['nom']);
        if (isset($body['email']))   $updates['email']   = trim($body['email']);
        if (isset($body['actif']))   $updates['actif']   = (int)$body['actif'];

        if (isset($body['role'])) {
            $rolesAutorises = ['sportif','operateur_fab','admin_fab','admin_chrono','super_admin'];
            if (!in_array($body['role'], $rolesAutorises, true)) {
                return $this->error($response, 'VALIDATION_ERROR', 'Rôle invalide', 400);
            }
            $updates['role'] = $body['role'];
        }

        // *** atelier_id : INT FK — null pour effacer ***
        if (array_key_exists('atelier_id', $body)) {
            $av = $body['atelier_id'];
            $atelierIdFk = ($av !== null && $av !== '') ? (int)$av : null;

            if ($atelierIdFk !== null) {
                $atelierExists = DB::table('ateliers')
                    ->where('id', $atelierIdFk)
                    ->where('actif', 1)
                    ->exists();
                if (!$atelierExists) {
                    return $this->error($response, 'VALIDATION_ERROR', 'Atelier introuvable ou inactif', 422);
                }
            }
            $updates['atelier_id'] = $atelierIdFk;  // ← INT FK

            // Si rôle FAB + atelier : garantir la conversation
            $roleForConv = $updates['role'] ?? (DB::table('users')->where('id', $targetId)->value('role') ?? '');
            if (in_array($roleForConv, ['operateur_fab', 'admin_fab'], true) && $atelierIdFk) {
                $this->ensureFabConversation($targetId, $atelierIdFk);
            }
        }

        if (empty($updates)) {
            return $this->error($response, 'VALIDATION_ERROR', 'Aucun champ à mettre à jour', 400);
        }

        DB::table('users')->where('id', $targetId)->update($updates);

        $this->logAudit($user->id, 'update_user', 'users', $targetId, $updates, $request);

        return $this->success($response, ['updated' => true, 'updates' => $updates]);
    }

    /**
     * Garantit l'existence d'une conversation chat pour l'atelier de l'utilisateur.
     * Appelé à la création / mise à jour d'un user FAB.
     */
    private function ensureFabConversation(int $userId, int $atelierIdFk): void
    {
        try {
            $atelier = DB::table('ateliers')->where('id', $atelierIdFk)->first();
            if (!$atelier || !$atelier->contact_id) return;

            $contactId = (int)$atelier->contact_id;

            // Julien
            $julien = DB::table('users')
                ->where('email', 'julien@mykollector.com')
                ->orWhere('role', 'super_admin')
                ->orderByRaw("CASE WHEN email='julien@mykollector.com' THEN 0 ELSE 1 END")
                ->first();

            if (!$julien) return;

            // Retrouver ou créer la conversation
            $convId = DB::table('chat_conversations')
                ->where('contact_id', $contactId)
                ->value('id');

            if (!$convId) {
                // Nom depuis mykolluwork si possible
                $titre = 'Entreprise #' . $contactId;
                try {
                    $c = DB::connection('workflow')->table('contacts')->where('id', $contactId)->first();
                    if ($c) $titre = $c->nom;
                } catch (\Exception $e) {}

                $convId = DB::table('chat_conversations')->insertGetId([
                    'titre'      => $titre,
                    'contact_id' => $contactId,
                    'created_at' => date('Y-m-d H:i:s'),
                ]);

                DB::table('chat_participants')->insert([
                    'conversation_id' => $convId,
                    'user_id'         => $julien->id,
                ]);
            }

            // Ajouter l'utilisateur comme participant s'il ne l'est pas
            $exists = DB::table('chat_participants')
                ->where('conversation_id', $convId)
                ->where('user_id', $userId)
                ->exists();

            if (!$exists) {
                DB::table('chat_participants')->insert([
                    'conversation_id' => $convId,
                    'user_id'         => $userId,
                ]);
            }
        } catch (\Exception $e) {
            error_log('[AdminController] ensureFabConversation error: ' . $e->getMessage());
        }
    }


// ════════════════════════════════════════════════════════════════
// À ajouter dans FabController — endpoint pour le <select> users.html
// Route : GET /api/fab/ateliers
// ════════════════════════════════════════════════════════════════

    /**
     * GET /api/fab/ateliers
     * Liste des ateliers actifs (pour le <select> de users.html).
     * Réservé aux super_admin.
     */
    public function ateliers(Request $request, Response $response): Response
    {
        $user = $this->getAuthUser($request);
        if (!$user || $user->role !== 'super_admin') {
            return $this->error($response, 'FORBIDDEN', 'Réservé au super admin', 403);
        }

        $ateliers = DB::table('ateliers')
            ->where('actif', 1)
            ->orderBy('est_mko_interne', 'desc')
            ->orderBy('nom', 'asc')
            ->get(['id', 'nom', 'contact_id', 'est_mko_interne', 'email']);

        return $this->success($response, $ateliers->toArray());
    }


// ════════════════════════════════════════════════════════════════
// Route à ajouter dans index.php (bloc ── PORTAIL FAB ──)
// ════════════════════════════════════════════════════════════════
// $app->get('/api/fab/ateliers', [\App\Controllers\FabController::class, 'ateliers']);
// $app->get('/api/admin/users',  [\App\Controllers\AdminController::class, 'users']);
//   → vérifier que users() retourne bien atelier_nom (JOIN sur ateliers)
// ════════════════════════════════════════════════════════════════
