<?php

namespace App\Filament\Resources\Products\Schemas;

use Filament\Actions\Action;
use Filament\Schemas\Schema;
use App\Filament\Helpers\FormHelper;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Section;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\ToggleButtons;

class ProductForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->components([
                Section::make(__('filament/admin/product_resource.basic_information'))
                    ->description(__('filament/admin/product_resource.basic_information_description'))
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        TextInput::make('code')
                            ->label(__('filament/admin/product_resource.code'))
                            ->placeholder(__('filament/admin/product_resource.code_placeholder'))
                            ->helperText(__('filament/admin/product_resource.code_help'))
                            ->disabled()
                            ->dehydrated(false)
                            ->default(fn() => 'PRD-' . date('Y') . '-' . str_pad(\App\Models\Product::whereYear('created_at', date('Y'))->count() + 1, 6, '0', STR_PAD_LEFT)),
                        TextInput::make('barcode')
                            ->label(__('filament/admin/product_resource.barcode'))
                            ->placeholder(__('filament/admin/product_resource.barcode_placeholder'))
                            ->helperText(__('filament/admin/product_resource.barcode_help'))
                            ->default(null)
                            ->maxLength(100)
                            ->unique(ignoreRecord: true),
                        TextInput::make('name')
                            ->label(__('filament/admin/product_resource.name'))
                            ->placeholder(__('filament/admin/product_resource.name_placeholder'))
                            ->helperText(__('filament/admin/product_resource.name_help'))
                            ->required()
                            ->minLength(2)
                            ->maxLength(255),
                        TextInput::make('name_ar')
                            ->label(__('filament/admin/product_resource.name_ar'))
                            ->placeholder(__('filament/admin/product_resource.name_ar_placeholder'))
                            ->helperText(__('filament/admin/product_resource.name_ar_help'))
                            ->default(null)
                            ->minLength(2)
                            ->maxLength(255)
                            ->hidden(),
                    ]),
                Section::make(__('filament/admin/product_resource.classification'))
                    ->description(__('filament/admin/product_resource.classification_description'))
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        Select::make('category_id')
                            ->label(__('filament/admin/product_resource.category_id'))
                            ->placeholder(__('filament/admin/product_resource.category_id_placeholder'))
                            ->helperText(__('filament/admin/product_resource.category_id_help'))
                            ->relationship('category', 'name')
                            ->required()
                            ->searchable()
                            ->preload()
                            ->createOptionForm([
                                TextInput::make('name')
                                    ->label(__('filament/admin/category_resource.name'))
                                    ->required()
                                    ->maxLength(255),
                            ])
                            ->createOptionUsing(function ($data) {
                                return \App\Models\Category::create($data)->id;
                            }),
                        Select::make('base_unit_id')
                            ->label(__('filament/admin/product_resource.base_unit_id'))
                            ->placeholder(__('filament/admin/product_resource.base_unit_id_placeholder'))
                            ->helperText(__('filament/admin/product_resource.base_unit_id_help'))
                            ->relationship(
                                name: 'baseUnit',
                                titleAttribute: 'name_ar',
                                modifyQueryUsing: fn($query) => $query->whereNotNull('name_ar')
                            )
                            ->getOptionLabelFromRecordUsing(fn($record) => $record->name_ar ?? $record->name ?? 'غير محدد')
                            ->required()
                            ->searchable()
                            ->preload()
                            ->live()
                            ->afterStateUpdated(function ($state, $set, $get) {
                                if ($state) {
                                    // إضافة الوحدة الأساسية تلقائياً في repeater الوحدات
                                    $productUnits = $get('productUnits') ?? [];

                                    // التحقق من عدم وجود الوحدة الأساسية بالفعل
                                    $exists = false;
                                    foreach ($productUnits as $unit) {
                                        if (isset($unit['unit_id']) && $unit['unit_id'] == $state) {
                                            $exists = true;
                                            break;
                                        }
                                    }

                                    // إضافة الوحدة الأساسية إذا لم تكن موجودة
                                    if (!$exists) {
                                        $productUnits[] = [
                                            'unit_id' => $state,
                                            'conversion_factor' => 1,
                                            'purchase_price' => 0,
                                            'selling_price' => 0,
                                            'is_default' => true,
                                            'is_default_purchase' => true,
                                        ];
                                        $set('productUnits', $productUnits);
                                    }
                                }
                            })
                            ->createOptionForm([
                                TextInput::make('name')
                                    ->label('الاسم')
                                    ->required()
                                    ->maxLength(255),
                            ])
                            ->createOptionUsing(function ($data) {
                                $data['tenant_id'] = auth()->user()->tenant_id;
                                $data['name_ar'] = $data['name'];
                                return \App\Models\Unit::create($data)->id;
                            }),
                    ]),
                Section::make(__('filament/admin/product_resource.inventory'))
                    ->description(__('filament/admin/product_resource.inventory_description'))
                    ->collapsible()
                    ->collapsed(false)
                    ->columns(2)
                    ->schema([
                        TextInput::make('min_stock_level')
                            ->label(__('filament/admin/product_resource.min_stock_level'))
                            ->placeholder('0')
                            ->helperText(fn($get) => 'الحد الأدنى قبل طلب إعادة ترتيب (بالوحدة الأساسية: ' . (\App\Models\Unit::find($get('base_unit_id'))?->name ?? 'حدد الوحدة أولاً') . ')')
                            ->required()
                            ->numeric()
                            ->minValue(0)
                            ->maxValue(999999)
                            ->step(1)
                            ->default(0.0)
                            ->live(),
                        TextInput::make('max_stock_level')
                            ->label(__('filament/admin/product_resource.max_stock_level'))
                            ->placeholder('0')
                            ->helperText(fn($get) => 'الحد الأقصى المطلوب للمخزون (بالوحدة الأساسية: ' . (\App\Models\Unit::find($get('base_unit_id'))?->name ?? 'حدد الوحدة أولاً') . ')')
                            ->numeric()
                            ->minValue(0)
                            ->maxValue(999999)
                            ->step(1)
                            ->default(null)
                            ->live(),
                        ToggleButtons::make('has_expiry_date')
                            ->label(__('filament/admin/product_resource.has_expiry_date'))
                            ->helperText(__('filament/admin/product_resource.has_expiry_date_help'))
                            ->boolean()
                            ->default(false),
                        ToggleButtons::make('track_stock')
                            ->label(__('filament/admin/product_resource.track_stock'))
                            ->helperText(__('filament/admin/product_resource.track_stock_help'))
                            ->boolean()
                            ->required()
                            ->columnSpanFull(),
                    ]),
                Section::make(__('filament/admin/product_resource.media_and_details'))
                    ->description(__('filament/admin/product_resource.media_and_details_description'))
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        Textarea::make('description')
                            ->label(__('filament/admin/product_resource.description'))
                            ->placeholder(__('filament/admin/product_resource.description_placeholder'))
                            ->helperText(__('filament/admin/product_resource.description_help'))
                            ->default(null)
                            ->maxLength(1000)
                            ->columnSpanFull(),
                        FileUpload::make('image')
                            ->label(__('filament/admin/product_resource.image'))
                            ->helperText(__('filament/admin/product_resource.image_help'))
                            ->image()
                            ->imageResizeMode('cover')
                            ->imageCropAspectRatio('16:9'),
                    ]),
                Section::make(__('filament/admin/product_resource.settings'))
                    ->description(__('filament/admin/product_resource.settings_description'))
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        ToggleButtons::make('is_active')
                            ->label(__('filament/admin/product_resource.is_active'))
                            ->helperText(__('filament/admin/product_resource.is_active_help'))
                            ->boolean()
                            ->default(true)
                            ->required(),
                    ]),
                Section::make('المخازن')
                    ->description('اختر المخازن التي سيكون المنتج متاحاً فيها')
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        // NOTE: Warehouses field removed as Warehouse resource was deleted
                        // Select::make('warehouses')
                        //     ->label(__('filament/admin/product_resource.warehouses'))
                        //     ->relationship('warehouses', 'name')
                        //     ->multiple()
                        //     ->searchable()
                        //     ->preload()
                        //     ->native(false)
                        //     ->selectablePlaceholder(false)
                        //     ->default(__('filament/admin/product_resource.warehouses_default'))
                        //     ->columnSpanFull()
                        //     ->hintActions([
                        //         Action::make('selectAll')
                        //             ->label('تحديد الكل')
                        //             ->action(function ($set) {
                        //                 $set('warehouses', \App\Models\Warehouse::pluck('id')->toArray());
                        //             }),
                        //         Action::make('deselectAll')
                        //             ->label('إلغاء الكل')
                        //             ->action(function ($set) {
                        //                 $set('warehouses', []);
                        //             }),
                        //     ]),
                    ]),
                Section::make('الوحدات الفرعية')
                    ->description('إضافة وحدات تعبئة وتغليف مختلفة للمنتج')
                    ->collapsible()
                    ->collapsed(false)
                    ->columnSpanFull()
                    ->schema([
                        Repeater::make('productUnits')
                            ->label(__('filament/admin/product_resource.product_units'))
                            ->relationship()
                            ->schema([
                                Select::make('unit_id')
                                    ->label(__('filament/admin/product_resource.unit_id'))
                                    ->relationship(
                                        name: 'unit',
                                        titleAttribute: 'name_ar',
                                        modifyQueryUsing: fn($query) => $query->whereNotNull('name_ar')
                                    )
                                    ->getOptionLabelFromRecordUsing(fn($record) => $record->name_ar ?? $record->name ?? 'غير محدد')
                                    ->required()
                                    ->searchable()
                                    ->preload()
                                    ->distinct()
                                    ->createOptionForm([
                                        TextInput::make('name')
                                            ->label('الاسم')
                                            ->required()
                                            ->maxLength(255),
                                    ])
                                    ->createOptionUsing(function ($data) {
                                        $data['tenant_id'] = auth()->user()->tenant_id;
                                        $data['name_ar'] = $data['name'];
                                        $data['symbol'] = substr($data['name'], 0, 3);
                                        return \App\Models\Unit::create($data)->id;
                                    })
                                    ->columnSpan(4),
                                TextInput::make('conversion_factor')
                                    ->label(__('filament/admin/product_resource.conversion_factor'))
                                    ->helperText('عدد الوحدات الأساسية في هذه الوحدة')
                                    ->required()
                                    ->numeric()
                                    ->minValue(0.0001)
                                    ->step(0.0001)
                                    ->default(1)
                                    ->live()
                                    ->columnSpan(2),
                                TextInput::make('purchase_price')
                                    ->label(__('filament/admin/product_resource.purchase_price'))
                                    ->helperText('سعر شراء هذه الوحدة')
                                    ->numeric()
                                    ->minValue(0)
                                    ->step(1)
                                    ->prefix('EGP')
                                    ->columnSpan(3),
                                TextInput::make('selling_price')
                                    ->label(__('filament/admin/product_resource.selling_price'))
                                    ->helperText('سعر بيع هذه الوحدة')
                                    ->numeric()
                                    ->minValue(0)
                                    ->step(1)
                                    ->prefix('EGP')
                                    ->columnSpan(3),
                                Toggle::make('is_default')
                                    ->label(__('filament/admin/product_resource.is_default'))
                                    ->helperText('هل هذه الوحدة افتراضية عند البيع؟')
                                    ->default(false)
                                    ->inline(false)
                                    ->columnSpan(3),
                                Toggle::make('is_default_purchase')
                                    ->label(__('filament/admin/product_resource.is_default_purchase'))
                                    ->helperText('هل هذه الوحدة افتراضية عند الشراء؟')
                                    ->default(false)
                                    ->inline(false)
                                    ->columnSpan(3),
                            ])
                            ->columns(12)
                            ->defaultItems(0)
                            ->addActionLabel('إضافة وحدة جديدة')
                            ->reorderableWithButtons()
                            ->collapsible()
                            ->cloneable()
                            ->itemLabel(
                                fn(array $state): string =>
                                isset($state['unit_id']) && $state['unit_id']
                                ? (\App\Models\Unit::find($state['unit_id'])?->name_ar ?? 'وحدة جديدة')
                                : 'وحدة جديدة'
                            )
                            ->columnSpanFull(),
                    ]),
            ]);
    }
}
