<?php

namespace App\Filament\Resources;

use App\Filament\Resources\TaskResource\Pages;
use App\Models\Task;
use App\Models\User;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use pxlrbt\FilamentExcel\Actions\Tables\ExportAction;
use pxlrbt\FilamentExcel\Actions\Tables\ExportBulkAction;
use pxlrbt\FilamentExcel\Exports\ExcelExport;

class TaskResource extends Resource
{
    protected static ?string $model = Task::class;

    protected static ?string $navigationIcon = 'heroicon-o-clipboard-document-check';
    protected static ?string $navigationGroup = 'تسک‌ها و یادآوری‌ها';
    protected static ?string $navigationLabel = 'تسک‌ها';
    protected static ?string $modelLabel = 'تسک';
    protected static ?string $pluralModelLabel = 'تسک‌ها';
    protected static ?int $navigationSort = 1;

    public static function form(Form $form): Form
    {
        return $form->schema([
            Forms\Components\Section::make()->columns(2)->schema([
                Forms\Components\TextInput::make('title')->label('عنوان')->required()->columnSpanFull(),
                Forms\Components\Select::make('priority')->label('اولویت')->options([
                    'low' => 'کم', 'medium' => 'متوسط', 'high' => 'زیاد',
                ])->default('medium')->required(),
                Forms\Components\Select::make('status')->label('وضعیت')->options([
                    'open' => 'باز', 'in_progress' => 'در حال انجام',
                    'done' => 'انجام‌شده', 'canceled' => 'لغوشده',
                ])->default('open')->required(),
                Forms\Components\DateTimePicker::make('due_date')->label('تاریخ سررسید')->jalali(),
                Forms\Components\Select::make('recurrence')->label('تکرار')->options([
                    'none' => 'بدون تکرار', 'daily' => 'روزانه', 'weekly' => 'هفتگی', 'monthly' => 'ماهانه',
                ])->default('none')->required(),
                Forms\Components\Select::make('assignees')->label('مسئولان')
                    ->relationship('assignees', 'name')
                    ->multiple()->searchable()->preload()
                    ->default(fn () => [auth()->id()])
                    ->columnSpanFull(),
                Forms\Components\Select::make('customer_id')->label('مشتری مرتبط (اختیاری)')
                    ->options(fn () => \App\Models\Customer::query()
                        ->when(! auth()->user()->canSeeAll('customers'), fn ($q) => $q->where('assigned_user_id', auth()->id()))
                        ->get()->mapWithKeys(fn ($c) => [$c->id => $c->display_name]))
                    ->searchable(),
                Forms\Components\Select::make('invoice_id')->label('فاکتور مرتبط (اختیاری)')
                    ->options(fn () => \App\Models\Invoice::query()
                        ->when(! auth()->user()->canSeeAll('invoices'), fn ($q) => $q->where('user_id', auth()->id()))
                        ->pluck('number', 'id'))
                    ->searchable(),
                Forms\Components\Textarea::make('description')->label('توضیحات')->columnSpanFull(),
                Forms\Components\FileUpload::make('attachments')->label('فایل‌های پیوست')
                    ->multiple()->disk('public')->directory('task-files')
                    ->downloadable()->openable()->reorderable()
                    ->webp()
                    ->columnSpanFull(),
            ]),

            // ───────── بخش مالی پیمانکار ─────────
            Forms\Components\Section::make('انجام کار توسط پیمانکار')
                ->description('اگر این کار توسط پیمانکار انجام شده، این بخش را فعال کنید.')
                ->icon('heroicon-o-wrench-screwdriver')
                ->visible(fn () => auth()->user()?->can('view_task_finance'))
                ->schema([
                    Forms\Components\Toggle::make('contractor_enabled')
                        ->label('کار توسط پیمانکار انجام شده است')
                        ->helperText('با فعال‌سازی، اطلاعات مالی پیمانکار اجباری می‌شود.')
                        ->live()
                        ->disabled(fn () => ! auth()->user()?->can('update_task_finance'))
                        ->columnSpanFull(),

                    Forms\Components\Group::make()
                        ->visible(fn (Forms\Get $get) => (bool) $get('contractor_enabled'))
                        ->columns(2)
                        ->schema([
                            Forms\Components\Select::make('contractor_id')->label('پیمانکار')
                                ->options(fn () => \App\Models\Contractor::query()->where('is_active', true)
                                    ->get()->mapWithKeys(fn ($c) => [$c->id => $c->display_name . ' — ' . \App\Support\NumberToWords::digits($c->mobile)]))
                                ->searchable()->preload()
                                ->required(fn (Forms\Get $get) => (bool) $get('contractor_enabled')),

                            Forms\Components\DatePicker::make('contractor_assigned_at')->label('تاریخ ارجاع کار')
                                ->jalali()
                                ->required(fn (Forms\Get $get) => (bool) $get('contractor_enabled')),

                            Forms\Components\TextInput::make('contractor_wage')->label('اجرت پرداختی به پیمانکار (ریال)')
                                ->numeric()->minValue(0)->live(onBlur: true)
                                ->required(fn (Forms\Get $get) => (bool) $get('contractor_enabled'))
                                ->disabled(fn () => ! auth()->user()?->can('update_task_finance')),

                            Forms\Components\TextInput::make('customer_payment')->label('مبلغ پرداختی مشتری (ریال)')
                                ->numeric()->minValue(0)->live(onBlur: true)
                                ->required(fn (Forms\Get $get) => (bool) $get('contractor_enabled'))
                                ->disabled(fn () => ! auth()->user()?->can('update_task_finance')),

                            Forms\Components\Placeholder::make('contractor_profit_preview')
                                ->label('سود مجموعه')
                                ->columnSpanFull()
                                ->content(function (Forms\Get $get) {
                                    $profit = (float) $get('customer_payment') - (float) $get('contractor_wage');
                                    $color = $profit >= 0 ? '#0d9488' : '#e11d48';
                                    $text = \App\Support\NumberToWords::money($profit) . ' ریال';

                                    return new \Illuminate\Support\HtmlString(
                                        "<span style=\"font-size:1.25rem;font-weight:700;color:{$color}\">{$text}</span>"
                                        . "<br><span style=\"color:#64748b\">" . \App\Support\NumberToWords::fa($profit) . ' ریال</span>'
                                    );
                                }),
                        ]),
                ]),
        ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('title')->label('عنوان')->searchable()->sortable(),
                Tables\Columns\TextColumn::make('priority')->label('اولویت')->badge()
                    ->color(fn ($state) => ['low' => 'gray', 'medium' => 'warning', 'high' => 'danger'][$state] ?? 'gray')
                    ->formatStateUsing(fn ($state) => ['low' => 'کم', 'medium' => 'متوسط', 'high' => 'زیاد'][$state] ?? $state),
                Tables\Columns\TextColumn::make('status')->label('وضعیت')->badge()
                    ->color(fn ($state) => ['open' => 'info', 'in_progress' => 'warning', 'done' => 'success', 'canceled' => 'gray'][$state] ?? 'gray')
                    ->formatStateUsing(fn ($state) => [
                        'open' => 'باز', 'in_progress' => 'در حال انجام',
                        'done' => 'انجام‌شده', 'canceled' => 'لغوشده',
                    ][$state] ?? $state),
                Tables\Columns\TextColumn::make('due_date')->label('سررسید')->jalaliDateTime()->sortable()
                    ->color(fn (Task $r) => $r->due_date && $r->due_date->isPast() && in_array($r->status, ['open', 'in_progress']) ? 'danger' : null),
                Tables\Columns\TextColumn::make('assignees.name')->label('مسئولان')->badge()->limitList(2),
                Tables\Columns\TextColumn::make('customer.display_name')->label('مشتری')->toggleable(),
                Tables\Columns\IconColumn::make('contractor_enabled')->label('پیمانکاری')->boolean()
                    ->toggleable()->visible(fn () => auth()->user()?->can('view_task_finance')),
                Tables\Columns\TextColumn::make('contractor.display_name')->label('پیمانکار')
                    ->toggleable(isToggledHiddenByDefault: true)
                    ->visible(fn () => auth()->user()?->can('view_task_finance')),
                Tables\Columns\TextColumn::make('contractor_profit')->label('سود مجموعه')
                    ->toggleable()
                    ->visible(fn () => auth()->user()?->can('view_task_finance'))
                    ->formatStateUsing(fn ($state) => $state === null ? '—' : \App\Support\NumberToWords::money($state) . ' ریال')
                    ->color(fn ($state) => $state === null ? null : ((float) $state >= 0 ? 'success' : 'danger')),
            ])
            ->filters([
                Tables\Filters\SelectFilter::make('status')->label('وضعیت')->options([
                    'open' => 'باز', 'in_progress' => 'در حال انجام',
                    'done' => 'انجام‌شده', 'canceled' => 'لغوشده',
                ]),
                Tables\Filters\SelectFilter::make('priority')->label('اولویت')->options([
                    'low' => 'کم', 'medium' => 'متوسط', 'high' => 'زیاد',
                ]),
                Tables\Filters\SelectFilter::make('assignees')->label('کارمند مسئول')
                    ->relationship('assignees', 'name')
                    ->visible(fn () => auth()->user()?->canSeeAll('tasks')),
                Tables\Filters\Filter::make('overdue')->label('عقب‌افتاده')
                    ->query(fn (Builder $q) => $q->overdue()),
                Tables\Filters\Filter::make('today')->label('امروز')
                    ->query(fn (Builder $q) => $q->today()),
            ])
            ->actions([
                Tables\Actions\Action::make('done')->label('انجام شد')->icon('heroicon-o-check')->color('success')
                    ->visible(fn (Task $r) => in_array($r->status, ['open', 'in_progress']))
                    ->action(function (Task $r) {
                        $r->update(['status' => 'done']);
                        $r->spawnNextOccurrence();
                    }),
                Tables\Actions\Action::make('pass')->label('پاس به کارمند')->icon('heroicon-o-arrow-right-circle')->color('info')
                    ->visible(fn (Task $r) => auth()->user()?->can('update', $r))
                    ->form([
                        Forms\Components\Select::make('new_user')->label('پاس‌دادن به')
                            ->options(fn () => User::where('is_active', true)->orderBy('name')->pluck('name', 'id'))
                            ->searchable()->required(),
                        Forms\Components\Textarea::make('pass_note')->label('یادداشت (اختیاری)'),
                    ])
                    ->action(function (Task $r, array $data) {
                        $newUser = User::find($data['new_user']);
                        if (! $newUser) {
                            return;
                        }
                        // انتقال مسئولیت تسک به کارمند جدید
                        $r->assignees()->sync([$newUser->id]);
                        $r->update(['last_notified_at' => null]);

                        $newUser->notify(new \App\Notifications\TaskAssignedNotification($r, auth()->user(), $data['pass_note'] ?? null));

                        \Filament\Notifications\Notification::make()->success()
                            ->title('تسک به ' . $newUser->name . ' پاس داده شد')->send();
                    }),
                Tables\Actions\EditAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                    ExportBulkAction::make()->exports([ExcelExport::make()->fromTable()->withFilename('tasks')]),
                ]),
            ])
            ->headerActions([
                ExportAction::make()->label('خروجی اکسل')->exports([ExcelExport::make()->fromTable()]),
            ])
            ->defaultSort('due_date', 'asc');
    }

    public static function getEloquentQuery(): Builder
    {
        /** @var User $user */
        $user = auth()->user();

        return parent::getEloquentQuery()->forUser($user);
    }

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