<?php

declare(strict_types=1);

namespace App\Filament\Resources\Reports\Tables;

use App\Filament\Support\SelectOptionLabels;

use App\Models\Report;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ForceDeleteBulkAction;
use Filament\Actions\RestoreBulkAction;
use Filament\Actions\ViewAction;
use Filament\Actions\Action;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Textarea;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Filters\TrashedFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Filament\Notifications\Notification;

class ReportsTable
{
    public static function configure(Table $table): Table
    {
        return $table
            ->columns([
                TextColumn::make('title')
                    ->label('عنوان گزارش')
                    ->searchable()
                    ->sortable()
                    ->limit(40),
                TextColumn::make('type')
                    ->label('نوع گزارش')
                    ->badge()
                    ->color(fn (int $state): string => match ($state) {
                        1 => 'success',
                        2 => 'info',
                        3 => 'warning',
                        default => 'gray',
                    })
                    ->formatStateUsing(fn (int $state): string => match ($state) {
                        1 => 'گزارش رشد',
                        2 => 'گزارش سلامت',
                        3 => 'گزارش جیره',
                        default => 'نامشخص',
                    }),
                TextColumn::make('project.name')
                    ->label('پروژه')
                    ->searchable()
                    ->sortable()
                    ->placeholder('-'),
                TextColumn::make('product.name')
                    ->label('محصول')
                    ->searchable()
                    ->sortable()
                    ->placeholder('-'),
                TextColumn::make('producer.brand_name')
                    ->label('تولیدکننده')
                    ->searchable()
                    ->sortable()
                    ->placeholder('-'),
                TextColumn::make('workflow_status')
                    ->label('وضعیت رسیدگی')
                    ->badge()
                    ->formatStateUsing(fn (?string $state) => match ($state ?? '') {
                        Report::WORKFLOW_PENDING => 'انتظار',
                        Report::WORKFLOW_APPROVED => 'تایید',
                        Report::WORKFLOW_REJECTED => 'رد',
                        Report::WORKFLOW_NEEDS_EDIT => 'ویرایش',
                        default => $state ?? '-',
                    })
                    ->color(fn (?string $state) => match ($state ?? '') {
                        Report::WORKFLOW_APPROVED => 'success',
                        Report::WORKFLOW_REJECTED => 'danger',
                        Report::WORKFLOW_NEEDS_EDIT => 'warning',
                        default => 'gray',
                    })
                    ->sortable(),
                TextColumn::make('unit')->label('واحد')->placeholder('-')->toggleable(),
                TextColumn::make('period')->label('دوره')->searchable()->toggleable(),
                TextColumn::make('date')
                    ->label('تاریخ گزارش')
                    ->jalaliDate('Y/m/d')
                    ->sortable(),
                TextColumn::make('status')
                    ->label('وضعیت')
                    ->badge()
                    ->color(fn (string $state): string => match ($state) {
                        'draft' => 'gray',
                        'published' => 'success',
                        'archived' => 'warning',
                        default => 'gray',
                    })
                    ->formatStateUsing(fn (string $state): string => match ($state) {
                        'draft' => 'پیش‌نویس',
                        'published' => 'منتشر شده',
                        'archived' => 'بایگانی شده',
                        default => $state,
                    }),
                TextColumn::make('user.getFilamentName')
                    ->label('کاربر')
                    ->getStateUsing(fn (Report $record) => $record->user?->getFilamentName())
                    ->searchable(['user.first_name', 'user.last_name', 'user.cellphone'])
                    ->sortable(),
                TextColumn::make('created_at')
                    ->label('تاریخ ایجاد')
                    ->jalaliDateTime('Y/m/d H:i')
                    ->sortable(),
            ])
            ->filters([
                TrashedFilter::make(),
                SelectFilter::make('project_id')
                    ->label('پروژه')
                    ->relationship('project', 'name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::project($record))
                    ->searchable()
                    ->preload(),
                SelectFilter::make('product_id')
                    ->label('محصول')
                    ->relationship('product', 'name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::product($record))
                    ->searchable()
                    ->preload(),
                SelectFilter::make('producer_id')
                    ->label('تولیدکننده')
                    ->relationship('producer', 'brand_name')
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::producer($record))
                    ->searchable()
                    ->preload(),
                SelectFilter::make('type')
                    ->label('نوع گزارش')
                    ->options([
                        1 => 'گزارش رشد',
                        2 => 'گزارش سلامت',
                        3 => 'گزارش جیره',
                    ]),
                SelectFilter::make('workflow_status')
                    ->label('وضعیت رسیدگی')
                    ->options([
                        Report::WORKFLOW_PENDING => 'انتظار',
                        Report::WORKFLOW_APPROVED => 'تایید',
                        Report::WORKFLOW_REJECTED => 'رد',
                        Report::WORKFLOW_NEEDS_EDIT => 'ویرایش',
                    ]),
                SelectFilter::make('status')
                    ->label('وضعیت')
                    ->options([
                        'draft' => 'پیش‌نویس',
                        'published' => 'منتشر شده',
                        'archived' => 'بایگانی شده',
                    ]),
                SelectFilter::make('user_id')
                    ->label('کاربر')
                    ->relationship('user', 'first_name')
                    ->searchable(['first_name', 'last_name', 'cellphone'])
                    ->getOptionLabelFromRecordUsing(fn ($record) => SelectOptionLabels::user($record))
                    ->preload(),
                Filter::make('date_range')
                    ->label('بازه زمانی')
                    ->schema([
                        DatePicker::make('date_from')->label('از تاریخ')->jalali(),
                        DatePicker::make('date_to')->label('تا تاریخ')->jalali(),
                    ])
                    ->query(function (Builder $q, array $data): Builder {
                        if (filled($data['date_from'] ?? null)) {
                            $q->whereDate('date', '>=', $data['date_from']);
                        }
                        if (filled($data['date_to'] ?? null)) {
                            $q->whereDate('date', '<=', $data['date_to']);
                        }
                        return $q;
                    }),
            ])
            ->recordActions([
                ViewAction::make(),
                Action::make('approve')
                    ->label('تایید')
                    ->icon('heroicon-o-check')
                    ->color('success')
                    ->visible(fn (Report $record) => ($record->workflow_status ?? Report::WORKFLOW_PENDING) === Report::WORKFLOW_PENDING)
                    ->action(function (Report $record): void {
                        $record->update(['workflow_status' => Report::WORKFLOW_APPROVED, 'admin_reason' => null]);
                        Notification::make()->title('گزارش تایید شد.')->success()->send();
                    }),
                Action::make('reject')
                    ->label('رد')
                    ->icon('heroicon-o-x-mark')
                    ->color('danger')
                    ->visible(fn (Report $record) => ($record->workflow_status ?? Report::WORKFLOW_PENDING) === Report::WORKFLOW_PENDING)
                    ->form([Textarea::make('admin_reason')->label('دلیل رد')->required()->rows(3)])
                    ->action(function (Report $record, array $data): void {
                        $record->update([
                            'workflow_status' => Report::WORKFLOW_REJECTED,
                            'admin_reason' => $data['admin_reason'],
                        ]);
                        Notification::make()->title('گزارش رد شد و به فرستنده ارسال می‌شود.')->warning()->send();
                    }),
                Action::make('needs_edit')
                    ->label('نیاز به ویرایش')
                    ->icon('heroicon-o-pencil-square')
                    ->color('warning')
                    ->visible(fn (Report $record) => ($record->workflow_status ?? Report::WORKFLOW_PENDING) === Report::WORKFLOW_PENDING)
                    ->form([Textarea::make('admin_reason')->label('دلیل و موارد اصلاح')->required()->rows(3)])
                    ->action(function (Report $record, array $data): void {
                        $record->update([
                            'workflow_status' => Report::WORKFLOW_NEEDS_EDIT,
                            'admin_reason' => $data['admin_reason'],
                        ]);
                        Notification::make()->title('گزارش برای ویرایش به فرستنده ارسال شد.')->warning()->send();
                    }),
                EditAction::make(),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make(),
                    ForceDeleteBulkAction::make(),
                    RestoreBulkAction::make(),
                ]),
            ]);
    }
}
