<?php

namespace App\Filament\Resources;

use App\Filament\Resources\RoleResource\Pages;
use App\Support\AccessControl;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Support\Collection;
use Spatie\Permission\Models\Role;

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

    protected static ?string $navigationIcon = 'heroicon-o-shield-check';
    protected static ?string $navigationGroup = 'مدیریت سیستم';
    protected static ?string $navigationLabel = 'نقش‌ها و سطوح دسترسی';
    protected static ?string $modelLabel = 'نقش';
    protected static ?string $pluralModelLabel = 'نقش‌ها و سطوح دسترسی';
    protected static ?int $navigationSort = 6;

    public static function canViewAny(): bool
    {
        return auth()->user()?->can('access_roles') ?? false;
    }

    public static function canCreate(): bool
    {
        return auth()->user()?->can('access_roles') ?? false;
    }

    public static function canEdit($record): bool
    {
        return auth()->user()?->can('access_roles') ?? false;
    }

    public static function canDelete($record): bool
    {
        // نقش مدیر کل قابل حذف نیست
        return (auth()->user()?->can('access_roles') ?? false) && $record->name !== 'admin';
    }

    public static function form(Form $form): Form
    {
        return $form->schema([
            Forms\Components\TextInput::make('name')
                ->label('نام نقش')
                ->required()
                ->maxLength(255)
                ->unique(ignoreRecord: true)
                ->helperText('مثلاً: مدیر فروش، حسابدار، انباردار …')
                ->disabled(fn (?Role $record) => $record?->name === 'admin')
                ->columnSpanFull(),

            Forms\Components\Section::make('دسترسی‌ها')
                ->description('برای هر بخش مشخص کنید این نقش چه کارهایی می‌تواند انجام دهد.')
                ->schema(static::permissionMatrixSchema())
                ->columns(1),
        ]);
    }

    /**
     * ساخت ماتریس دسترسی به‌صورت گروه‌بندی‌شده (هر گروه ناوبری → بخش‌ها → توانایی‌ها).
     */
    public static function permissionMatrixSchema(): array
    {
        $abilityLabels = AccessControl::abilityLabels();

        // گروه‌بندی بخش‌ها بر اساس گروه ناوبری (با حفظ کلیدهای رشته‌ای بخش‌ها)
        $byGroup = collect(AccessControl::sections())
            ->groupBy(fn ($section) => $section['group'], preserveKeys: true);

        $schema = [];

        foreach ($byGroup as $groupName => $sections) {
            $sectionFields = [];

            foreach ($sections as $key => $section) {
                $options = [];
                foreach ($section['abilities'] as $ability) {
                    $permName = AccessControl::permissionName($ability, $key);
                    $options[$permName] = $abilityLabels[$ability] ?? $ability;
                }

                $sectionFields[] = Forms\Components\CheckboxList::make("matrix.{$key}")
                    ->label($section['label'])
                    ->options($options)
                    ->bulkToggleable()
                    ->dehydrated(false) // در ستون مدل ذخیره نمی‌شود؛ دستی sync می‌کنیم
                    // نمایش دسترسی‌های فعلی نقش هنگام ویرایش (تیک‌خورده‌ها)
                    ->afterStateHydrated(function (Forms\Components\CheckboxList $component) {
                        $record = $component->getRecord();
                        if ($record && $record->exists) {
                            $optionKeys = array_keys($component->getOptions());
                            $current = $record->permissions->pluck('name')->all();
                            $component->state(array_values(array_intersect($optionKeys, $current)));
                        }
                    })
                    ->columns(count($options) > 3 ? 4 : count($options))
                    ->columnSpanFull();
            }

            $schema[] = Forms\Components\Fieldset::make($groupName)
                ->schema($sectionFields)
                ->columns(1);
        }

        return $schema;
    }

    /**
     * تخت‌کردن مقادیر ماتریس فرم به فهرست نام مجوزها.
     */
    public static function flattenMatrix(?array $matrix): array
    {
        // فقط مجوزهای معتبر (موجود در رجیستری) همگام شوند تا از خطای «مجوز ناموجود» جلوگیری شود.
        $valid = AccessControl::allPermissions();

        return collect($matrix ?? [])
            ->flatten()
            ->filter()
            ->unique()
            ->intersect($valid)
            ->values()
            ->all();
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('name')->label('نام نقش')
                    ->formatStateUsing(fn ($state) => AccessControl::roleLabel($state) . " ({$state})")
                    ->searchable(),
                Tables\Columns\TextColumn::make('permissions_count')->label('تعداد دسترسی‌ها')
                    ->counts('permissions')->badge()->color('info'),
                Tables\Columns\TextColumn::make('users_count')->label('تعداد کاربران')
                    ->counts('users')->badge()->color('success'),
            ])
            ->actions([
                Tables\Actions\EditAction::make()->label('ویرایش دسترسی‌ها'),
                Tables\Actions\DeleteAction::make()
                    ->visible(fn (Role $record) => $record->name !== 'admin'),
            ]);
    }

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