<?php

namespace App\Filament\Resources;

use App\Filament\Resources\UserResource\Pages;
use App\Models\User;
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\Role;

class UserResource extends Resource
{
    protected static ?string $model = User::class;

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

    protected static string | \UnitEnum | null $navigationGroup = 'الأمان والصلاحيات';

    protected static ?string $modelLabel = 'مستخدم';

    protected static ?string $pluralModelLabel = 'المستخدمون';

    protected static ?int $navigationSort = 19;

    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()
                            ->maxLength(255),

                        Forms\Components\TextInput::make('email')
                            ->label('البريد الإلكتروني')
                            ->email()
                            ->required()
                            ->unique(ignoreRecord: true)
                            ->maxLength(255),

                        Forms\Components\TextInput::make('phone')
                            ->label('رقم الهاتف')
                            ->tel()
                            ->maxLength(20),

                        Forms\Components\TextInput::make('password')
                            ->label('كلمة المرور')
                            ->password()
                            ->dehydrateStateUsing(fn (?string $state) => filled($state) ? bcrypt($state) : null)
                            ->dehydrated(fn (?string $state) => filled($state))
                            ->required(fn (string $operation) => $operation === 'create')
                            ->maxLength(255)
                            ->helperText(fn (string $operation) => $operation === 'edit' ? 'اتركه فارغاً إذا لم ترد تغييره' : ''),
                    ])
                    ->columns(2),

                Section::make('الحالة والنوع')
                    ->schema([
                        Forms\Components\Toggle::make('is_active')
                            ->label('نشط')
                            ->default(true)
                            ->helperText('إيقاف النشاط يمنع المستخدم من الدخول'),

                        Forms\Components\Toggle::make('is_admin')
                            ->label('مستخدم لوحة التحكم')
                            ->default(false)
                            ->helperText('تفعيله يسمح بالدخول للوحة تحكم الأدمن')
                            ->reactive(),

                        Forms\Components\TextInput::make('points_balance')
                            ->label('رصيد النقاط')
                            ->numeric()
                            ->default(0)
                            ->suffix('نقطة'),
                    ])
                    ->columns(3),

                Section::make('الأدوار والصلاحيات')
                    ->description('اختر الأدوار التي يملكها هذا المستخدم (للموظفين فقط)')
                    ->schema([
                        Forms\Components\CheckboxList::make('roles')
                            ->label('')
                            ->relationship('roles', 'name')
                            ->options(
                                Role::all()->pluck('name', 'id')->map(fn ($name) => match ($name) {
                                    'admin' => '🔴 المدير (Admin) — كامل الصلاحيات',
                                    'store_manager' => '🟡 مدير المخازن (Store Manager) — المنتجات وأوامر الشراء',
                                    'sales_agent' => '🔵 موظف المبيعات (Sales Agent) — متابعة الطلبات',
                                    default => $name,
                                })->toArray()
                            )
                            ->columns(1)
                            ->bulkToggleable(),
                    ]),
            ]);
    }

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

                Tables\Columns\ImageColumn::make('avatar')
                    ->label('')
                    ->circular()
                    ->defaultImageUrl(fn (User $record) => 'https://ui-avatars.com/api/?name=' . urlencode($record->name) . '&background=10b981&color=fff&size=40')
                    ->size(36),

                Tables\Columns\TextColumn::make('name')
                    ->label('الاسم')
                    ->searchable()
                    ->sortable(),

                Tables\Columns\TextColumn::make('email')
                    ->label('البريد الإلكتروني')
                    ->searchable()
                    ->sortable(),

                Tables\Columns\TextColumn::make('phone')
                    ->label('الهاتف')
                    ->searchable()
                    ->toggleable(),

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

                Tables\Columns\TextColumn::make('points_balance')
                    ->label('النقاط')
                    ->numeric(0)
                    ->suffix(' نقطة')
                    ->sortable(),

                Tables\Columns\IconColumn::make('is_admin')
                    ->label('أدمن')
                    ->boolean()
                    ->sortable(),

                Tables\Columns\IconColumn::make('is_active')
                    ->label('نشط')
                    ->boolean()
                    ->sortable(),

                Tables\Columns\TextColumn::make('orders_count')
                    ->label('الطلبات')
                    ->counts('orders')
                    ->badge()
                    ->color('success')
                    ->sortable(),

                Tables\Columns\TextColumn::make('created_at')
                    ->label('تاريخ التسجيل')
                    ->dateTime('d/m/Y H:i')
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
            ])
            ->defaultSort('id', 'desc')
            ->filters([
                Tables\Filters\TernaryFilter::make('is_admin')
                    ->label('النوع')
                    ->trueLabel('موظفين (أدمن)')
                    ->falseLabel('تجار'),

                Tables\Filters\TernaryFilter::make('is_active')
                    ->label('الحالة')
                    ->trueLabel('نشط')
                    ->falseLabel('موقوف'),

                Tables\Filters\SelectFilter::make('roles')
                    ->label('الدور')
                    ->relationship('roles', 'name')
                    ->multiple()
                    ->preload(),
            ])
            ->actions([
                Actions\EditAction::make()->label('تعديل'),
            ])
            ->bulkActions([
                Actions\BulkActionGroup::make([
                    Actions\DeleteBulkAction::make()->label('حذف المحدد'),
                ]),
            ]);
    }

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