<?php

namespace App\Filament\Resources;

use App\Filament\Resources\DocumentResource\Pages;
use App\Filament\Resources\DocumentResource\RelationManagers;
use App\Models\Document;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;

class DocumentResource extends Resource
{
    protected static ?string $model = Document::class;

    protected static ?string $navigationIcon = 'heroicon-o-document-text';

    protected static ?string $navigationLabel = '文档管理';

    protected static ?string $modelLabel = '文档';

    protected static ?string $pluralModelLabel = '文档';

    protected static ?int $navigationSort = 1;

    protected static ?string $navigationGroup = '知识库管理';

    /**
     * 控制导航菜单是否显示
     */
    public static function shouldRegisterNavigation(): bool
    {
        return auth()->user()?->can('document.view') ?? false;
    }

    public static function getEloquentQuery(): Builder
    {
        $query = parent::getEloquentQuery();
        $user = auth()->user();

        if ($user && $user->hasStationRestriction()) {
            $accessibleKbIds = \App\Models\KnowledgeBase::accessibleBy($user)->pluck('id');
            $query->whereIn('knowledge_base_id', $accessibleKbIds);
        }

        return $query;
    }

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->label('文档标题')
                    ->required()
                    ->maxLength(255)
                    ->placeholder('请输入文档标题')
                    ->columnSpanFull(),

                Forms\Components\Textarea::make('description')
                    ->label('文档描述')
                    ->rows(3)
                    ->maxLength(65535)
                    ->placeholder('请输入文档描述（可选）')
                    ->columnSpanFull(),

                Forms\Components\FileUpload::make('file')
                    ->label('文档文件')
                    ->required()
                    ->acceptedFileTypes(config('documents.supported_formats.mime_types', [
                        'application/msword',
                        'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                        'application/pdf',
                        'application/vnd.ms-powerpoint',
                        'application/vnd.openxmlformats-officedocument.presentationml.presentation',
                    ]))
                    ->maxSize(51200) // 50MB
                    ->storeFileNamesIn('file_name')
                    ->disk('local')
                    ->directory('documents/' . date('Y/m/d'))
                    ->visibility('private')
                    ->downloadable()
                    ->helperText('支持 .docx/.pptx/.xlsx/.pdf 格式，最大 50MB')
                    ->columnSpanFull(),

                Forms\Components\Select::make('knowledge_base_id')
                    ->label('所属知识库')
                    ->relationship('knowledgeBase', 'name')
                    ->required()
                    ->searchable()
                    ->preload()
                    ->helperText('选择文档所属的知识库'),
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('title')
                    ->label('文档标题')
                    ->searchable()
                    ->sortable()
                    ->limit(50)
                    ->tooltip(function (Tables\Columns\TextColumn $column): ?string {
                        $state = $column->getState();
                        if (strlen($state) > 50) {
                            return $state;
                        }
                        return null;
                    }),

                Tables\Columns\TextColumn::make('knowledgeBase.name')
                    ->label('所属知识库')
                    ->searchable()
                    ->sortable(),

                Tables\Columns\TextColumn::make('uploader.name')
                    ->label('上传者')
                    ->searchable()
                    ->sortable()
                    ->toggleable(),

                Tables\Columns\TextColumn::make('file_size')
                    ->label('文件大小')
                    ->formatStateUsing(fn($state): string => self::formatFileSize($state))
                    ->sortable()
                    ->toggleable(),

                Tables\Columns\TextColumn::make('conversion_status')
                    ->label('转换状态')
                    ->badge()
                    ->color(fn(?string $state): string => match ($state) {
                        'completed' => 'success',
                        'processing' => 'info',
                        'pending' => 'warning',
                        'failed' => 'danger',
                        default => 'gray',
                    })
                    ->formatStateUsing(fn(?string $state): string => match ($state) {
                        'completed' => '已完成',
                        'processing' => '转换中',
                        'pending' => '等待转换',
                        'failed' => '转换失败',
                        default => '未知',
                    })
                    ->sortable()
                    ->toggleable(),

                Tables\Columns\TextColumn::make('created_at')
                    ->label('上传时间')
                    ->dateTime('Y年m月d日 H:i')
                    ->sortable()
                    ->toggleable(),

                Tables\Columns\TextColumn::make('updated_at')
                    ->label('更新时间')
                    ->dateTime('Y年m月d日 H:i')
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
            ])
            ->filters([
                Tables\Filters\SelectFilter::make('knowledge_base_id')
                    ->label('所属知识库')
                    ->relationship('knowledgeBase', 'name')
                    ->searchable()
                    ->preload()
                    ->placeholder('全部知识库'),

                Tables\Filters\SelectFilter::make('uploaded_by')
                    ->label('上传者')
                    ->relationship('uploader', 'name')
                    ->searchable()
                    ->preload()
                    ->placeholder('全部上传者'),

                Tables\Filters\SelectFilter::make('conversion_status')
                    ->label('转换状态')
                    ->options([
                        'pending' => '等待转换',
                        'processing' => '转换中',
                        'completed' => '已完成',
                        'failed' => '转换失败',
                    ])
                    ->placeholder('全部状态'),
            ])
            ->actions([
                Tables\Actions\Action::make('retry_conversion')
                    ->label('重试转换')
                    ->icon('heroicon-o-arrow-path')
                    ->color('warning')
                    ->visible(
                        fn(Document $record): bool =>
                        in_array($record->conversion_status, ['failed', 'processing', 'pending'])
                    )
                    ->requiresConfirmation()
                    ->modalHeading('重试文档转换')
                    ->modalDescription(
                        fn(Document $record): string =>
                        '确定要重新转换文档 "' . $record->title . '" 吗？' .
                            "\n\n当前状态：" . match ($record->conversion_status) {
                                'failed' => '转换失败',
                                'processing' => '转换中（可能卡住）',
                                'pending' => '等待转换',
                                default => $record->conversion_status,
                            } .
                            ($record->conversion_error ? "\n\n错误信息：" . $record->conversion_error : '')
                    )
                    ->modalSubmitActionLabel('确认重试')
                    ->action(function (Document $record) {
                        try {
                            app(\App\Services\DocumentConversionService::class)
                                ->queueConversion($record);

                            \Filament\Notifications\Notification::make()
                                ->success()
                                ->title('重试成功')
                                ->body('文档转换任务已重新加入队列，请稍后查看转换结果。')
                                ->send();
                        } catch (\Exception $e) {
                            \Filament\Notifications\Notification::make()
                                ->danger()
                                ->title('重试失败')
                                ->body('无法重新派发转换任务：' . $e->getMessage())
                                ->send();
                        }
                    }),
                Tables\Actions\Action::make('view_error')
                    ->label('查看错误')
                    ->icon('heroicon-o-exclamation-triangle')
                    ->color('danger')
                    ->visible(
                        fn(Document $record): bool =>
                        $record->conversion_status === 'failed' && !empty($record->conversion_error)
                    )
                    ->modalHeading('转换错误详情')
                    ->modalContent(
                        fn(Document $record): \Illuminate\Contracts\View\View =>
                        view('filament.modals.conversion-error', [
                            'document' => $record,
                            'error' => $record->conversion_error,
                        ])
                    )
                    ->modalSubmitAction(false)
                    ->modalCancelActionLabel('关闭'),
                Tables\Actions\Action::make('preview')
                    ->label('预览 Markdown')
                    ->icon('heroicon-o-eye')
                    ->color('info')
                    ->visible(fn(Document $record): bool => $record->conversion_status === 'completed')
                    ->url(fn(Document $record): string => route('documents.preview', $record))
                    ->openUrlInNewTab()
                    ->tooltip(
                        fn(Document $record): ?string =>
                        $record->conversion_status !== 'completed'
                            ? '文档尚未完成转换'
                            : null
                    ),
                Tables\Actions\Action::make('download')
                    ->label('下载')
                    ->icon('heroicon-o-arrow-down-tray')
                    ->color('success')
                    ->action(function (Document $record) {
                        $documentService = app(\App\Services\DocumentService::class);
                        $user = auth()->user();

                        try {
                            // 记录下载日志
                            $documentService->logDownload($record, $user);

                            // 返回文件下载响应
                            return $documentService->downloadDocument($record, $user);
                        } catch (\Exception $e) {
                            \Filament\Notifications\Notification::make()
                                ->danger()
                                ->title('下载失败')
                                ->body($e->getMessage())
                                ->send();

                            return null;
                        }
                    }),
                Tables\Actions\ViewAction::make()
                    ->label('查看'),
                Tables\Actions\EditAction::make()
                    ->label('编辑'),
                Tables\Actions\DeleteAction::make()
                    ->label('删除'),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make()
                        ->label('批量删除'),
                ]),
            ])
            ->defaultSort('created_at', 'desc');
    }

    /**
     * 格式化文件大小
     */
    public static function formatFileSize(?int $bytes): string
    {
        if ($bytes === null) {
            return '-';
        }

        $units = ['B', 'KB', 'MB', 'GB'];
        $bytes = max($bytes, 0);
        $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
        $pow = min($pow, count($units) - 1);
        $bytes /= (1 << (10 * $pow));

        return round($bytes, 2) . ' ' . $units[$pow];
    }

    public static function getRelations(): array
    {
        return [
            //
        ];
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListDocuments::route('/'),
            'create' => Pages\CreateDocument::route('/create'),
            'view' => Pages\ViewDocument::route('/{record}'),
            'edit' => Pages\EditDocument::route('/{record}/edit'),
        ];
    }
}
