<?php

namespace App\Filament\Resources\SpareParts;

use BackedEnum;
use App\Models\Unit;
use App\Models\Category;
use App\Models\Product;
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\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Tables\Columns\IconColumn;
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\Filament\Resources\SpareParts\Pages\EditSparePart;
use App\Filament\Resources\SpareParts\Pages\ListSpareParts;
use App\Filament\Resources\SpareParts\Pages\CreateSparePart;

class SparePartResource extends Resource
{
    protected static ?string $model = Product::class;

    protected static ?string $navigationLabel = null;

    protected static ?string $modelLabel = null;

    protected static ?string $pluralModelLabel = null;

    protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedWrenchScrewdriver;
    protected static ?int $navigationSort = 2;

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

    public static function getEloquentQuery(): Builder
    {
        return parent::getEloquentQuery()->where('is_spare_part', true);
    }

    public static function form(Schema $schema): Schema
    {
        return $schema->components([
            TextInput::make('code')
                ->label(__('filament/admin/spare_part_resource.code'))
                ->disabled()
                ->dehydrated(false)
                ->placeholder('يولد تلقائياً'),

            TextInput::make('name')
                ->label(__('filament/admin/spare_part_resource.name'))
                ->required()
                ->maxLength(255),

            TextInput::make('name_ar')
                ->label(__('filament/admin/spare_part_resource.name_ar'))
                ->maxLength(255),

            Select::make('category_id')
                ->label(__('filament/admin/spare_part_resource.category_id'))
                ->options(Category::query()->whereNotNull('name')->pluck('name', 'id')->toArray())
                ->searchable()
                ->required(),

            Select::make('base_unit_id')
                ->label(__('filament/admin/spare_part_resource.base_unit_id'))
                ->options(Unit::query()->whereNotNull('name_ar')->pluck('name_ar', 'id')->toArray())
                ->searchable()
                ->required(),

            TextInput::make('min_stock_level')
                ->label(__('filament/admin/spare_part_resource.min_stock_level'))
                ->numeric()
                ->default(0),

            TextInput::make('cost_price')
                ->label(__('filament/admin/spare_part_resource.cost_price'))
                ->numeric()
                ->default(0),

            Toggle::make('track_stock')
                ->label(__('filament/admin/spare_part_resource.track_stock'))
                ->default(true),

            Toggle::make('is_active')
                ->label(__('filament/admin/spare_part_resource.is_active'))
                ->default(true),
        ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->applyTenantScope()
            ->columns([
                TextColumn::make('code')->label(__('filament/admin/spare_part_resource.code'))->searchable()->sortable(),
                TextColumn::make('name')->label(__('filament/admin/spare_part_resource.name'))->searchable()->sortable(),
                TextColumn::make('baseUnit.name_ar')->label(__('filament/admin/spare_part_resource.base_unit.name_ar'))->sortable(),
                TextColumn::make('spare_part_on_hand')
                    ->label(__('filament/admin/spare_part_resource.spare_part_on_hand'))
                    ->numeric(decimalPlaces: 3)
                    ->sortable(false),
                TextColumn::make('min_stock_level')->label(__('filament/admin/spare_part_resource.min_stock_level'))->numeric(decimalPlaces: 2),
                IconColumn::make('is_active')->label(__('filament/admin/spare_part_resource.is_active'))->boolean(),
            ])
            ->headerActions([
                CreateAction::make(),
            ])
            ->recordActions([
                EditAction::make(),
                DeleteAction::make()->requiresConfirmation(),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make()->requiresConfirmation(),
                ]),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => ListSpareParts::route('/'),
            'create' => CreateSparePart::route('/create'),
            'edit' => EditSparePart::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_resource.navigation_label');
    }
    public static function getModelLabel(): string
    {
        return __('filament/admin/spare_part_resource.model_label');
    }
    public static function getPluralModelLabel(): string
    {
        return __('filament/admin/spare_part_resource.plural_model_label');
    }



}
