<?php

namespace App\Filament\Resources\Users\Pages;

use App\Filament\Concerns\EnforcesPlanLimits;
use App\Filament\Resources\Users\UserResource;
use App\Services\PlanLimitService;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Support\Facades\Auth;
use Spatie\Permission\Models\Role;

class CreateUser extends CreateRecord
{
    use EnforcesPlanLimits;

    protected static string $resource = UserResource::class;

    // create + saveRelationships (sync de roles) en una transacción → el lock de
    // lockPlanForUpdate() serializa creaciones concurrentes de la empresa, incluido
    // el cupo de cobradores que se cuenta tras asignar el rol (#169).
    protected ?bool $hasDatabaseTransactions = true;

    protected function beforeCreate(): void
    {
        $company = $this->planLimitCompany();

        if (! $company) {
            return; // super_admin sin empresa (company_id null): no aplica cupo de empresa
        }

        $this->lockPlanForUpdate($company);

        $this->guardPlanLimit(function () use ($company): void {
            $service = app(PlanLimitService::class);
            $service->assertCanAddUser($company);

            // Si el rol elegido es cobrador, también valida el cupo de cobradores.
            $roleIds = array_map('intval', (array) ($this->data['roles'] ?? []));
            $selectsCollector = Role::whereKey($roleIds)->where('name', 'collector')->exists();

            if ($selectsCollector) {
                $service->assertCanAddCollector($company);
            }
        });
    }

    /**
     * ** CRÍTICO **
     * Inyecta el company_id del usuario autenticado en los datos antes de la creación.
     * Esto asegura que los Company Admins solo creen usuarios para su propia compañía.
     */
    protected function mutateFormDataBeforeCreate(array $data): array
    {
        $user = Auth::user();

        // Si el usuario actual NO es Super Admin, inyectamos su company_id.
        if (! $user->isSuperAdmin()) {
            // Utilizamos el company_id del administrador actual.
            $data['company_id'] = $user->company_id;
        }

        return $data;
    }

    /**
     * Define a dónde redirigir después de una creación exitosa.
     * Se redirige incondicionalmente a la lista (index) para estandarizar el flujo.
     */
    protected function getRedirectUrl(): string
    {
        // Redirige incondicionalmente a la página de índice (lista) para cualquier usuario.
        return $this->getResource()::getUrl('index');
    }
}
