<?php

namespace App\Filament\Resources\Users\RelationManagers;

use App\Models\User;
use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DetachAction;
use Filament\Actions\DetachBulkAction;
use Filament\Forms\Components\Select;
use Filament\Notifications\Notification;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

class AssignedCollectorsRelationManager extends RelationManager
{
    protected static string $relationship = 'assignedCollectors';

    protected static ?string $title = 'Cobradores asignados';

    /**
     * Solo visible cuando el usuario registrado tiene rol supervisor.
     * Los admins gestionan asignaciones aquí también (supervisor con rol admin).
     */
    public static function canViewForRecord(Model $ownerRecord, string $pageClass): bool
    {
        return Auth::user()?->hasAnyRole(['super_admin', 'admin'])
            && $ownerRecord->hasAnyRole(['supervisor', 'admin']);
    }

    public function form(Schema $schema): Schema
    {
        // El formulario del RelationManager no se usa (acción custom maneja el modal).
        return $schema->components([]);
    }

    public function table(Table $table): Table
    {
        return $table
            ->recordTitleAttribute('name')
            ->columns([
                TextColumn::make('name')
                    ->label('Nombre')
                    ->searchable()
                    ->sortable(),
                TextColumn::make('email')
                    ->label('Email')
                    ->searchable(),
                TextColumn::make('phone')
                    ->label('Teléfono'),
            ])
            ->filters([])
            ->headerActions([
                // AttachAction no funciona con BelongsToMany self-referencial en Filament 4:
                // internamente deriva el método `users()` desde el nombre de la tabla,
                // que no existe en User. Además, AttachAction no llenaría company_id en
                // el pivot automáticamente. Se usa Action custom con modal Select.
                Action::make('assign_collector')
                    ->label('Asignar cobrador')
                    ->icon('heroicon-o-user-plus')
                    ->form(function (): array {
                        $companyId = Auth::user()?->company_id;

                        // Excluir cobradores ya asignados para evitar duplicados en el select.
                        $assignedIds = $this->ownerRecord
                            ->assignedCollectors()
                            ->pluck('users.id');

                        return [
                            Select::make('collector_id')
                                ->label('Cobrador')
                                ->options(
                                    User::where('company_id', $companyId)
                                        ->role('collector')
                                        ->whereNotIn('id', $assignedIds)
                                        ->orderBy('name')
                                        ->pluck('name', 'id')
                                        ->toArray()
                                )
                                ->searchable()
                                ->required()
                                ->placeholder('Seleccionar cobrador'),
                        ];
                    })
                    ->action(function (array $data): void {
                        $companyId = Auth::user()?->company_id;

                        $this->ownerRecord
                            ->assignedCollectors()
                            ->attach($data['collector_id'], ['company_id' => $companyId]);

                        Notification::make()
                            ->success()
                            ->title('Cobrador asignado')
                            ->send();
                    }),
            ])
            ->recordActions([
                DetachAction::make()
                    ->label('Desasignar'),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DetachBulkAction::make()
                        ->label('Desasignar seleccionados'),
                ]),
            ]);
    }
}
