<?php

namespace App\Filament\Resources\Products\Tables;

use Filament\Tables\Table;
use Filament\Actions\Action;
use Filament\Actions\EditAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ImageColumn;

class ProductsTable
{
    public static function configure(Table $table): Table
    {
        return $table
            ->columns([
                TextColumn::make('code')
                    ->label(__('filament/admin/product_resource.code'))
                    ->searchable()
                    ->sortable(),
                TextColumn::make('barcode')
                    ->label(__('filament/admin/product_resource.barcode'))
                    ->searchable()
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: false),
                TextColumn::make('name')
                    ->label(__('filament/admin/product_resource.name'))
                    ->searchable()
                    ->sortable(),
                TextColumn::make('name_ar')
                    ->label(__('filament/admin/product_resource.name_ar'))
                    ->searchable()
                    ->sortable()
                    ->hidden(),
                TextColumn::make('category.name')
                    ->label(__('filament/admin/product_resource.category.name'))
                    ->searchable()
                    ->sortable(),
                TextColumn::make('baseUnit.name')
                    ->label(__('filament/admin/product_resource.base_unit.name'))
                    ->searchable()
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: false)
                    ->toggleable(),
                TextColumn::make('stock_balance')
                    ->label('الرصيد')
                    ->getStateUsing(function ($record) {
                        // حساب الرصيد الافتتاحي
                        $openingBalance = \App\Models\OpeningBalance::where('product_id', $record->id)
                            ->sum('quantity') ?? 0;

                        // حساب رصيد الحركات المخزنية (المشتريات والمبيعات والمرتجعات)
                        $movementsBalance = \App\Models\StockMovement::where('product_id', $record->id)
                            ->selectRaw('SUM(CASE WHEN movement_type = "in" THEN quantity ELSE -quantity END) as balance')
                            ->value('balance') ?? 0;

                        // الرصيد الإجمالي
                        $totalBalance = $openingBalance + $movementsBalance;

                        if ($totalBalance <= 0) {
                            return 'لا يوجد رصيد';
                        }

                        // جلب جميع الوحدات مرتبة من الأكبر للأصغر
                        $units = $record->productUnits()
                            ->with('unit')
                            ->orderBy('conversion_factor', 'desc')
                            ->get();

                        // إضافة الوحدة الأساسية للقائمة
                        $allUnits = collect([
                            (object) [
                                'unit' => $record->baseUnit,
                                'conversion_factor' => 1
                            ]
                        ])->concat($units->map(function ($pu) {
                            return (object) [
                                'unit' => $pu->unit,
                                'conversion_factor' => $pu->conversion_factor
                            ];
                        }))
                            ->unique(fn($item) => $item->unit->id)
                            ->sortByDesc('conversion_factor');

                        $remainingBalance = $totalBalance;
                        $result = [];

                        foreach ($allUnits as $unitItem) {
                            if ($remainingBalance <= 0)
                                break;

                            $quantity = floor($remainingBalance / $unitItem->conversion_factor);

                            if ($quantity > 0) {
                                $result[] = rtrim(rtrim(number_format($quantity, 2, '.', ''), '0'), '.') . ' ' . $unitItem->unit->name;
                                $remainingBalance -= ($quantity * $unitItem->conversion_factor);
                            }
                        }

                        return empty($result) ? 'لا يوجد رصيد' : implode(' و ', $result);
                    })
                    ->html()
                    ->weight('bold')
                    ->color('success')
                    ->badge()
                    ->searchable(false)
                    ->sortable(false),
                TextColumn::make('min_stock_level')
                    ->label(__('filament/admin/product_resource.min_stock_level'))
                    ->numeric(decimalPlaces: 0)
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true)
                    ->summarize([
                        \Filament\Tables\Columns\Summarizers\Sum::make()
                            ->label(__('filament/admin/product_resource.total_min')),
                    ]),
                TextColumn::make('max_stock_level')
                    ->label(__('filament/admin/product_resource.max_stock_level'))
                    ->numeric(decimalPlaces: 0)
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true)
                    ->summarize([
                        \Filament\Tables\Columns\Summarizers\Sum::make()
                            ->label(__('filament/admin/product_resource.total_max')),
                    ]),
                IconColumn::make('track_stock')
                    ->label(__('filament/admin/product_resource.track_stock'))
                    ->boolean()
                    ->toggleable(isToggledHiddenByDefault: true),
                IconColumn::make('is_active')
                    ->label(__('filament/admin/product_resource.is_active'))
                    ->boolean()
                    ->sortable(),
                ImageColumn::make('image')
                    ->label(__('filament/admin/product_resource.image'))
                    ->toggleable(isToggledHiddenByDefault: true),
                TextColumn::make('created_at')
                    ->label(__('filament/admin/product_resource.created_at'))
                    ->dateTime()
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
                TextColumn::make('updated_at')
                    ->label(__('filament/admin/product_resource.updated_at'))
                    ->dateTime()
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
            ])
            ->filters([
                //
            ])
            ->recordActions([
                Action::make('view_units')
                    ->label('الوحدات والأسعار')
                    ->icon('heroicon-o-view-columns')
                    ->color('info')
                    ->modalHeading(fn($record) => 'وحدات وأسعار: ' . $record->name)
                    ->modalDescription('عرض جميع الوحدات والأسعار والأرصدة للمنتج')
                    ->modalContent(fn($record) => view('filament.resources.products.view-units', [
                        'product' => $record,
                        'productUnits' => $record->productUnits()->with('unit')->get(),
                    ]))
                    ->modalSubmitAction(false)
                    ->modalCancelActionLabel('إغلاق')
                    ->slideOver(),
                EditAction::make(),
                DeleteAction::make()
                    ->requiresConfirmation(),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make(),
                ]),
            ]);
    }
}
