<?php

namespace App\Filament\Resources;

use App\Filament\Resources\RoleResource\Pages;
use Filament\Actions;
use Filament\Forms;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Filament\Tables;
use Filament\Tables\Table;
use Spatie\Permission\Models\Permission;
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 | \UnitEnum | null $navigationGroup = 'الأمان والصلاحيات';

    protected static ?string $modelLabel = 'دور';

    protected static ?string $pluralModelLabel = 'الأدوار';

    protected static ?int $navigationSort = 20;

    public static function canAccess(): bool
    {
        return auth()->user()?->hasRole('admin') ?? false;
    }

    public static function form(Schema $schema): Schema
    {
        return $schema
            ->components([
                Section::make('بيانات الدور')
                    ->schema([
                        Forms\Components\TextInput::make('name')
                            ->label('اسم الدور')
                            ->required()
                            ->unique(ignoreRecord: true)
                            ->maxLength(255),

                        Forms\Components\Select::make('guard_name')
                            ->label('Guard')
                            ->options(['web' => 'Web'])
                            ->default('web')
                            ->required()
                            ->native(false),
                    ])
                    ->columns(2),

                Section::make('الصلاحيات')
                    ->description('اختر الصلاحيات التي يمتلكها هذا الدور')
                    ->schema([
                        Forms\Components\CheckboxList::make('permissions')
                            ->label('')
                            ->relationship('permissions', 'name')
                            ->options(fn () => self::getGroupedPermissions())
                            ->columns(3)
                            ->gridDirection('row')
                            ->bulkToggleable()
                            ->searchable(),
                    ]),
            ]);
    }

    protected static function getGroupedPermissions(): array
    {
        $labels = [
            'view_suppliers' => 'عرض الموردين',
            'create_suppliers' => 'إضافة مورد',
            'edit_suppliers' => 'تعديل مورد',
            'delete_suppliers' => 'حذف مورد',
            'view_products' => 'عرض المنتجات',
            'create_products' => 'إضافة منتج',
            'edit_products' => 'تعديل منتج',
            'delete_products' => 'حذف منتج',
            'view_orders' => 'عرض الطلبات',
            'create_orders' => 'إنشاء طلب',
            'edit_orders' => 'تعديل طلب',
            'delete_orders' => 'حذف طلب',
            'view_purchase_orders' => 'عرض أوامر الشراء',
            'create_purchase_orders' => 'إنشاء أمر شراء',
            'edit_purchase_orders' => 'تعديل أمر شراء',
            'delete_purchase_orders' => 'حذف أمر شراء',
            'manage_point_settings' => 'إدارة إعدادات النقاط',
            'view_financial_reports' => 'عرض التقارير المالية',
            'manage_users' => 'إدارة المستخدمين',
        ];

        return Permission::all()->pluck('name', 'id')->map(fn ($name) => $labels[$name] ?? $name)->toArray();
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('id')
                    ->label('#')
                    ->sortable(),

                Tables\Columns\TextColumn::make('name')
                    ->label('اسم الدور')
                    ->badge()
                    ->color(fn (string $state): string => match ($state) {
                        'admin' => 'danger',
                        'store_manager' => 'warning',
                        'sales_agent' => 'info',
                        default => 'gray',
                    })
                    ->formatStateUsing(fn (string $state) => match ($state) {
                        'admin' => 'المدير',
                        'store_manager' => 'مدير المخازن',
                        'sales_agent' => 'موظف المبيعات',
                        default => $state,
                    })
                    ->searchable()
                    ->sortable(),

                Tables\Columns\TextColumn::make('permissions_count')
                    ->label('عدد الصلاحيات')
                    ->counts('permissions')
                    ->badge()
                    ->color('success')
                    ->sortable(),

                Tables\Columns\TextColumn::make('users_count')
                    ->label('عدد المستخدمين')
                    ->counts('users')
                    ->badge()
                    ->color('primary')
                    ->sortable(),

                Tables\Columns\TextColumn::make('created_at')
                    ->label('تاريخ الإنشاء')
                    ->dateTime('d/m/Y H:i')
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
            ])
            ->defaultSort('id', 'asc')
            ->actions([
                Actions\EditAction::make()->label('تعديل'),
            ])
            ->bulkActions([
                Actions\BulkActionGroup::make([
                    Actions\DeleteBulkAction::make()->label('حذف المحدد'),
                ]),
            ]);
    }

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