<?php

namespace App\Filament\Resources\MachineMaintenanceOrders;

use App\Filament\Resources\MachineMaintenanceOrders\Pages\CreateMachineMaintenanceOrder;
use App\Filament\Resources\MachineMaintenanceOrders\Pages\EditMachineMaintenanceOrder;
use App\Filament\Resources\MachineMaintenanceOrders\Pages\ListMachineMaintenanceOrders;
use App\Models\Machine;
use App\Models\MachineMaintenanceOrder;
use BackedEnum;
use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Textarea;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;

class MachineMaintenanceOrderResource extends Resource
{
    protected static ?string $model = MachineMaintenanceOrder::class;

    protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedWrenchScrewdriver;
    protected static ?string $navigationLabel = 'أوامر الصيانة';
    protected static ?int $navigationSort = 4;

    public static function getNavigationGroup(): ?string
    {
        return 'التشغيل والصيانة';
    }

    public static function form(Schema $schema): Schema
    {
        return $schema->components([
            Section::make('بيانات أمر الصيانة')
                ->columnSpanFull()
                ->schema([
                    TextInput::make('order_no')
                        ->label('رقم الأمر')
                        ->disabled()
                        ->dehydrated(false)
                        ->placeholder('يولد تلقائياً'),

                    DatePicker::make('maintenance_date')
                        ->label('تاريخ الصيانة')
                        ->required()
                        ->default(today()),

                    Select::make('machine_id')
                        ->label('المعدة')
                        ->options(Machine::query()->where('is_active', true)->pluck('name', 'id')->toArray())
                        ->searchable()
                        ->required(),

                    Select::make('priority')
                        ->label('الأولوية')
                        ->options([
                            'low' => 'منخفضة',
                            'medium' => 'متوسطة',
                            'high' => 'عالية',
                            'critical' => 'حرجة',
                        ])
                        ->default('medium')
                        ->required(),

                    Select::make('status')
                        ->label('الحالة')
                        ->options([
                            'open' => 'مفتوح',
                            'approved' => 'معتمد',
                            'in_progress' => 'قيد التنفيذ',
                            'completed' => 'مكتمل',
                            'cancelled' => 'ملغي',
                        ])
                        ->default('open')
                        ->required(),

                    TextInput::make('estimated_cost')
                        ->label('التكلفة التقديرية')
                        ->numeric()
                        ->default(0),

                    TextInput::make('actual_cost')
                        ->label('التكلفة الفعلية')
                        ->numeric()
                        ->default(0),

                    Textarea::make('issue_description')
                        ->label('وصف العطل')
                        ->required()
                        ->rows(3)
                        ->columnSpanFull(),

                    Textarea::make('diagnosis')
                        ->label('التشخيص')
                        ->rows(3)
                        ->columnSpanFull(),

                    Textarea::make('resolution')
                        ->label('الإجراء المتخذ')
                        ->rows(3)
                        ->columnSpanFull(),

                    Textarea::make('notes')
                        ->label('ملاحظات')
                        ->rows(2)
                        ->columnSpanFull(),
                ])
                ->columns(2),
        ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                TextColumn::make('order_no')->label('رقم الأمر')->searchable()->sortable(),
                TextColumn::make('maintenance_date')->label('التاريخ')->date('Y-m-d')->sortable(),
                TextColumn::make('machine.name')->label('المعدة')->searchable()->sortable(),
                TextColumn::make('priority')
                    ->label('الأولوية')
                    ->badge(),
                TextColumn::make('status')
                    ->label('الحالة')
                    ->badge(),
                TextColumn::make('estimated_cost')->label('تقديري')->money('EGP'),
                TextColumn::make('actual_cost')->label('فعلي')->money('EGP'),
                TextColumn::make('stock_issue_requests_count')->label('طلبات الصرف')->counts('stockIssueRequests'),
                TextColumn::make('spare_part_installations_count')->label('التركيبات')->counts('sparePartInstallations'),
            ])
            ->actions([
                Action::make('approve')
                    ->label('اعتماد')
                    ->requiresConfirmation()
                    ->action(fn (MachineMaintenanceOrder $record) => $record->approve())
                    ->visible(fn (MachineMaintenanceOrder $record) => $record->status === 'open'),

                Action::make('start')
                    ->label('بدء التنفيذ')
                    ->requiresConfirmation()
                    ->action(fn (MachineMaintenanceOrder $record) => $record->markInProgress())
                    ->visible(fn (MachineMaintenanceOrder $record) => $record->status === 'approved'),

                Action::make('complete')
                    ->label('إكمال')
                    ->requiresConfirmation()
                    ->action(fn (MachineMaintenanceOrder $record) => $record->complete())
                    ->visible(fn (MachineMaintenanceOrder $record) => $record->status === 'in_progress'),

                EditAction::make(),
                DeleteAction::make(),
            ])
            ->bulkActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make(),
                ]),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => ListMachineMaintenanceOrders::route('/'),
            'create' => CreateMachineMaintenanceOrder::route('/create'),
            'edit' => EditMachineMaintenanceOrder::route('/{record}/edit'),
        ];
    }
}
