<?php

namespace App\Filament\Resources\SparePartInstallations;

use BackedEnum;
use App\Models\Machine;
use App\Models\MachineMaintenanceOrder;
use App\Models\StockMovement;
use Filament\Tables\Table;
use Filament\Schemas\Schema;
use Filament\Resources\Resource;
use Filament\Support\Icons\Heroicon;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\DatePicker;
use Filament\Tables\Columns\TextColumn;
use Filament\Actions\CreateAction;
use Filament\Actions\EditAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Illuminate\Database\Eloquent\Builder;
use App\Models\SparePartInstallation;
use App\Filament\Resources\SparePartInstallations\Pages\EditSparePartInstallation;
use App\Filament\Resources\SparePartInstallations\Pages\ListSparePartInstallations;
use App\Filament\Resources\SparePartInstallations\Pages\CreateSparePartInstallation;

class SparePartInstallationResource extends Resource
{
    protected static ?string $model = SparePartInstallation::class;

    protected static ?string $navigationLabel = null;

    protected static ?string $modelLabel = null;

    protected static ?string $pluralModelLabel = null;

    protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedWrench;
    protected static ?int $navigationSort = 3;

    public static function getNavigationGroup(): string|null
    {
        return 'المعدات وقطع الغيار';
    }

    public static function form(Schema $schema): Schema
    {
        return $schema->components([
            Select::make('stock_movement_id')
                ->label(__('filament/admin/spare_part_installation_resource.stock_movement_id'))
                ->options(fn () => StockMovement::query()
                    ->where('movement_type', 'out')
                    ->whereHas('product', fn (Builder $query) => $query->where('is_spare_part', true))
                    ->orderByDesc('id')
                    ->limit(500)
                    ->get()
                    ->mapWithKeys(fn (StockMovement $movement) => [
                        $movement->id => ($movement->reference_number ?? ('SM-' . $movement->id))
                            . ' | ' . ($movement->product?->name ?? '-')
                            . ' | Qty: ' . number_format((float) $movement->quantity, 3),
                    ])
                    ->toArray())
                ->searchable()
                ->required(),

            Select::make('machine_id')
                ->label(__('filament/admin/spare_part_installation_resource.machine_id'))
                ->options(fn () => Machine::query()
                    ->where('is_active', true)
                    ->orderBy('name')
                    ->pluck('name', 'id')
                    ->toArray())
                ->searchable()
                ->required(),

            Select::make('maintenance_order_id')
                ->label('أمر الصيانة')
                ->options(function (callable $get) {
                    $machineId = $get('machine_id');

                    return MachineMaintenanceOrder::query()
                        ->when($machineId, fn($query) => $query->where('machine_id', $machineId))
                        ->whereIn('status', ['open', 'approved', 'in_progress'])
                        ->orderByDesc('maintenance_date')
                        ->pluck('order_no', 'id')
                        ->toArray();
                })
                ->searchable(),

            TextInput::make('installed_qty')
                ->label(__('filament/admin/spare_part_installation_resource.installed_qty'))
                ->required()
                ->numeric()
                ->minValue(0.001),

            DatePicker::make('installed_at')
                ->label(__('filament/admin/spare_part_installation_resource.installed_at'))
                ->required()
                ->default(now()),

            Textarea::make('notes')
                ->label(__('filament/admin/spare_part_installation_resource.notes'))
                ->rows(3),
        ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->applyTenantScope()
            ->columns([
                TextColumn::make('installed_at')->label(__('filament/admin/spare_part_installation_resource.installed_at'))->date(),
                TextColumn::make('machine.code')->label(__('filament/admin/spare_part_installation_resource.machine.code'))->searchable(),
                TextColumn::make('machine.name')->label(__('filament/admin/spare_part_installation_resource.machine.name'))->searchable()->sortable(),
                TextColumn::make('maintenanceOrder.order_no')->label('أمر الصيانة')->toggleable(),
                TextColumn::make('stockMovement.reference_number')->label(__('filament/admin/spare_part_installation_resource.stock_movement.reference_number'))->searchable(),
                TextColumn::make('stockMovement.product.name')->label(__('filament/admin/spare_part_installation_resource.stock_movement.product.name'))->searchable(),
                TextColumn::make('installed_qty')->label(__('filament/admin/spare_part_installation_resource.installed_qty'))->numeric(decimalPlaces: 3),
                TextColumn::make('created_at')->label(__('filament/admin/spare_part_installation_resource.created_at'))->dateTime('Y-m-d H:i')->toggleable(isToggledHiddenByDefault: true),
            ])
            ->headerActions([
                CreateAction::make(),
            ])
            ->recordActions([
                EditAction::make(),
                DeleteAction::make()->requiresConfirmation(),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make()->requiresConfirmation(),
                ]),
            ]);
    }

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

    public static function canViewAny(): bool
    {
        return true;
    }

    public static function canCreate(): bool
    {
        return true;
    }

    public static function canEdit($record): bool
    {
        return true;
    }

    public static function canDelete($record): bool
    {
        return true;
    }

    public static function canDeleteAny(): bool
    {
        return true;
    }
    public static function getNavigationLabel(): string
    {
        return __('filament/admin/spare_part_installation_resource.navigation_label');
    }
    public static function getModelLabel(): string
    {
        return __('filament/admin/spare_part_installation_resource.model_label');
    }
    public static function getPluralModelLabel(): string
    {
        return __('filament/admin/spare_part_installation_resource.plural_model_label');
    }



}
