<?php

namespace App\Filament\Tenant\Resources;

use App\Auth\Permissions;
use App\Filament\Tenant\Resources\RoleResource\Pages;
use Filament\Actions;
use Filament\Forms;
use Filament\Resources\Resource;
use Filament\Schemas;
use Filament\Schemas\Schema;
use Filament\Tables;
use Filament\Tables\Table;
use Spatie\Permission\Models\Role;

class RoleResource extends Resource
{
    protected static ?string $model = Role::class;

    protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-shield-check';

    protected static ?string $navigationLabel = 'Roluri & Drepturi';

    protected static string|\UnitEnum|null $navigationGroup = 'Admin';

    protected static ?string $modelLabel = 'rol';

    protected static ?string $pluralModelLabel = 'roluri';

    protected static ?int $navigationSort = 82;

    public static function canViewAny(): bool
    {
        return auth()->user()?->canDo(Permissions::ADMIN_ROLES_MANAGE) ?? false;
    }

    public static function form(Schema $schema): Schema
    {
        return $schema->components([
            Schemas\Components\Section::make('Rol')
                ->columns(2)
                ->schema([
                    Forms\Components\TextInput::make('name')->label('Slug')->required()->maxLength(64)
                        ->disabled(fn ($record) => $record && in_array($record->name, array_keys(Permissions::roleMatrix()), true))
                        ->helperText('Rolurile sistem (owner/admin/etc.) au numele blocat'),
                    Forms\Components\TextInput::make('guard_name')->default('web')->disabled(),
                ]),
            Schemas\Components\Section::make('Drepturi')
                ->description('Bifează ce poate face acest rol. Modificările au efect imediat.')
                ->schema(self::permissionFields())
                ->columns(1),
        ]);
    }

    private static function permissionFields(): array
    {
        $fields = [];
        $labels = Permissions::labels();
        foreach (Permissions::grouped() as $module => $perms) {
            $options = [];
            foreach ($perms as $p) {
                $options[$p] = $p;
            }
            $fields[] = Forms\Components\CheckboxList::make("permissions_{$module}")
                ->label($labels[$module] ?? ucfirst($module))
                ->options($options)
                ->columns(2)
                ->bulkToggleable()
                ->afterStateHydrated(function (Forms\Components\CheckboxList $component, $state, $record) use ($module) {
                    if (! $record) { $component->state([]); return; }
                    $names = $record->permissions->pluck('name')->all();
                    $module_prefix = $module . '.';
                    $component->state(array_values(array_filter($names, fn ($n) => str_starts_with($n, $module_prefix))));
                })
                ->dehydrated(false);
        }
        return $fields;
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('name')
                    ->label('Rol')
                    ->formatStateUsing(fn ($state) => Permissions::roleLabels()[$state] ?? $state)
                    ->searchable()
                    ->sortable(),
                Tables\Columns\TextColumn::make('name')
                    ->label('Slug')
                    ->copyable()
                    ->color('gray'),
                Tables\Columns\TextColumn::make('permissions_count')
                    ->counts('permissions')
                    ->label('Drepturi')
                    ->badge(),
                Tables\Columns\TextColumn::make('users_count')
                    ->counts('users')
                    ->label('Utilizatori')
                    ->badge(),
            ])
            ->actions([
                Actions\EditAction::make()->label('Editează drepturi'),
                Actions\DeleteAction::make()
                    ->hidden(fn ($record) => in_array($record->name, array_keys(Permissions::roleMatrix()), true)),
            ])
            ->defaultSort('name');
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListRoles::route('/'),
            'edit' => Pages\EditRole::route('/{record}/edit'),
        ];
    }
}
