<?php

declare(strict_types=1);

namespace App\Http\Controllers\Concerns;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

/**
 * Резолв saas_admin_users.id для audit-trail на MVP (saas-admin SSO ⏸ Б-1).
 *
 * Берёт admin_user_id из request-параметра; при отсутствии валидного —
 * создаёт/переиспользует системный стаб-аккаунт (не loginable, is_active=false),
 * чтобы соблюсти NOT NULL + FK на saas_admin_users в saas_admin_audit_log.
 *
 * Паттерн ранее дублировался в AdminPricingTiersController /
 * AdminSystemSettingsController; новый код использует этот трейт.
 */
trait ResolvesAdminUserId
{
    protected function resolveAdminUserId(Request $request, string $stubEmail, string $stubName): int
    {
        // Прод: crm_app_user не имеет прав на saas_admin_users → берём системный
        // admin-id из конфига, не обращаясь к таблице (фикс 500 на admin-сохранениях).
        // null (dev/test, суперюзер) → fallback на старую логику ниже.
        $configured = config('admin.audit_system_user_id');
        if ($configured !== null) {
            return (int) $configured;
        }

        $requested = $request->input('admin_user_id');
        if (is_int($requested) || (is_string($requested) && ctype_digit($requested))) {
            $existing = DB::table('saas_admin_users')->where('id', (int) $requested)->value('id');
            if ($existing !== null) {
                return (int) $existing;
            }
        }

        $existingId = DB::table('saas_admin_users')->where('email', $stubEmail)->value('id');
        if ($existingId !== null) {
            return (int) $existingId;
        }

        return (int) DB::table('saas_admin_users')->insertGetId([
            'email' => $stubEmail,
            'full_name' => $stubName,
            'password_hash' => '$2y$04$system-stub-not-loginable',
            'role' => 'super_admin',
            'is_active' => false,
            'sso_provider' => 'local',
            'is_break_glass' => false,
        ]);
    }
}
