<?php

namespace App\Filament\Tenant\Resources;

use App\Filament\Tenant\Resources\PurchaseResource\Pages;
use App\Filament\Tenant\Resources\PurchaseResource\RelationManagers;
use App\Models\Tenant\Purchase;
use App\Models\Tenant\Supplier;
use App\Models\Tenant\Warehouse;
use Filament\Actions;
use Filament\Forms;
use Filament\Notifications\Notification;
use Filament\Resources\Resource;
use Filament\Schemas;
use Filament\Schemas\Schema;
use Filament\Tables;
use Filament\Tables\Table;

class PurchaseResource extends Resource
{
    protected static ?string $model = Purchase::class;

    protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-shopping-cart';

    protected static ?string $navigationLabel = 'Achiziții';

    protected static string|\UnitEnum|null $navigationGroup = 'Depozit';

    protected static ?string $modelLabel = 'achiziție';

    protected static ?string $pluralModelLabel = 'achiziții';

    protected static ?int $navigationSort = 43;

    public static function form(Schema $schema): Schema
    {
        return $schema->components([
            Schemas\Components\Section::make('Antet')
                ->columns(3)
                ->schema([
                    Forms\Components\TextInput::make('number')->label('Nr.')->disabled()->dehydrated(false)->placeholder('Generat automat'),
                    Forms\Components\Select::make('supplier_id')
                        ->label('Furnizor')
                        ->options(fn () => Supplier::where('is_active', true)->pluck('name', 'id'))
                        ->searchable()
                        ->required(),
                    Forms\Components\Select::make('warehouse_id')
                        ->label('Depozit țintă')
                        ->options(fn () => Warehouse::where('is_active', true)->pluck('name', 'id'))
                        ->default(fn () => Warehouse::where('is_default', true)->value('id'))
                        ->required(),
                    Forms\Components\Select::make('status')
                        ->options(Purchase::STATUSES)
                        ->default('draft')
                        ->required(),
                    Forms\Components\DatePicker::make('order_date')->label('Data comandă')->default(today())->required(),
                    Forms\Components\DatePicker::make('expected_at')->label('Așteptată'),
                    Forms\Components\DatePicker::make('received_at')->label('Recepționată'),
                    Forms\Components\DatePicker::make('paid_at')->label('Plătită')->columnSpanFull(),
                ]),
            Forms\Components\Textarea::make('notes')->label('Observații')->columnSpanFull()->rows(2),
        ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('number')->label('Nr.')->searchable()->sortable(),
                Tables\Columns\TextColumn::make('supplier.name')->label('Furnizor')->searchable(),
                Tables\Columns\TextColumn::make('order_date')->label('Comandată')->date('d.m.Y'),
                Tables\Columns\TextColumn::make('expected_at')->label('Așteptată')->date('d.m.Y')->placeholder('—'),
                Tables\Columns\TextColumn::make('received_at')->label('Recepționată')->date('d.m.Y')->placeholder('—'),
                Tables\Columns\TextColumn::make('status')
                    ->formatStateUsing(fn ($s) => Purchase::STATUSES[$s] ?? $s)
                    ->badge()
                    ->colors([
                        'gray' => ['draft'],
                        'warning' => ['ordered'],
                        'info' => ['partial'],
                        'success' => ['received'],
                        'danger' => ['cancelled'],
                    ]),
                Tables\Columns\TextColumn::make('received_progress')
                    ->label('Progres')
                    ->state(function (Purchase $r) {
                        $items = $r->items;
                        $ord = (float) $items->sum('qty');
                        $rec = (float) $items->sum('qty_received');
                        return $ord > 0 ? sprintf('%d%%', (int) round($rec / $ord * 100)) : '—';
                    })
                    ->alignRight(),
                Tables\Columns\TextColumn::make('total')->money('MDL')->alignRight(),
            ])
            ->filters([
                Tables\Filters\SelectFilter::make('status')->options(Purchase::STATUSES),
                Tables\Filters\SelectFilter::make('supplier_id')
                    ->label('Furnizor')
                    ->options(fn () => Supplier::pluck('name', 'id')),
            ])
            ->actions([
                Actions\Action::make('receive_all')
                    ->label('Recepție totală')
                    ->icon('heroicon-m-check-circle')
                    ->color('success')
                    ->visible(fn (Purchase $r) => ! in_array($r->status, ['received', 'cancelled', 'draft'], true))
                    ->requiresConfirmation()
                    ->modalDescription('Se vor crea batch-uri pentru toate restanțele rămase în depozitul țintă.')
                    ->action(function (Purchase $r) {
                        try {
                            $r->receiveAllRemaining();
                            Notification::make()
                                ->title('Recepție completă — batch-uri create')
                                ->success()
                                ->send();
                        } catch (\Throwable $e) {
                            Notification::make()
                                ->title('Eroare')
                                ->body($e->getMessage())
                                ->danger()
                                ->send();
                        }
                    }),
                Actions\EditAction::make(),
                Actions\DeleteAction::make(),
            ])
            ->defaultSort('order_date', 'desc');
    }

    public static function getRelations(): array
    {
        return [
            RelationManagers\ItemsRelationManager::class,
        ];
    }

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