<?php

declare(strict_types=1);

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

/**
 * Менеджеры tenant'а — всё users одного tenant'а кроме soft-deleted и
 * is_active=false. Используется в NewDealDialog для выпадающего списка.
 *
 * На MVP: tenant_id параметром. На prod: middleware('auth:sanctum')+'tenant',
 * tenant_id из $request->user()->tenant_id.
 */
class ManagerController extends Controller
{
    /** GET /api/managers?tenant_id={id} */
    public function index(Request $request): JsonResponse
    {
        // Go-live: tenant_id из authed-user (auth:sanctum + tenant middleware),
        // НЕ из параметра запроса — закрывает кросс-tenant утечку списка пользователей.
        $tenantId = (int) $request->user()->tenant_id;

        $users = DB::transaction(function () use ($tenantId) {
            DB::statement('SET LOCAL app.current_tenant_id = '.$tenantId);

            // Явный where(tenant_id) — defense-in-depth поверх RLS: роли с
            // BYPASSRLS (crm_supplier_worker / dev-superuser) RLS не применяют,
            // поэтому tenant-scope нельзя оставлять только на SET LOCAL.
            return User::query()
                ->where('tenant_id', $tenantId)
                ->whereNull('deleted_at')
                ->where('is_active', true)
                ->orderBy('first_name')
                ->orderBy('last_name')
                ->get(['id', 'email', 'first_name', 'last_name']);
        });

        return response()->json([
            'managers' => $users->map(fn (User $u) => [
                'id' => $u->id,
                'email' => $u->email,
                'first_name' => $u->first_name,
                'last_name' => $u->last_name,
                'name' => self::formatName($u->first_name, $u->last_name, $u->email),
                'initials' => self::formatInitials($u->first_name, $u->last_name, $u->email),
            ]),
        ]);
    }

    public static function formatName(?string $first, ?string $last, string $email): string
    {
        if ($first && $last) {
            return $first.' '.mb_substr($last, 0, 1).'.';
        }
        if ($first) {
            return $first;
        }

        return $email;
    }

    public static function formatInitials(?string $first, ?string $last, string $email): string
    {
        $f = $first ? mb_substr($first, 0, 1) : '';
        $l = $last ? mb_substr($last, 0, 1) : '';
        $initials = mb_strtoupper($f.$l);
        if ($initials !== '') {
            return $initials;
        }

        return mb_strtoupper(mb_substr($email, 0, 2));
    }
}
