<?php

namespace App\Filament\Resources\Customers\Schemas;

use Filament\Schemas\Schema;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Section;
use Filament\Forms\Components\ToggleButtons;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\DatePicker;
use App\Services\NationalIdParser;
use App\Models\Governorate;
use App\Models\City;

class CustomerForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->components([
                Section::make(__('filament/admin/customer_resource.basic_information'))
                    ->description(__('filament/admin/customer_resource.basic_information_description'))
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        TextInput::make('code')
                            ->label(__('filament/admin/customer_resource.code'))
                            ->placeholder(__('filament/admin/customer_resource.code_placeholder'))
                            ->helperText(__('filament/admin/customer_resource.code_help'))
                            ->disabled()
                            ->dehydrated(false)
                            ->default(fn() => 'CUS-' . date('Y') . '-' . str_pad(\App\Models\Customer::whereYear('created_at', date('Y'))->count() + 1, 6, '0', STR_PAD_LEFT)),
                        TextInput::make('name')
                            ->label(__('filament/admin/customer_resource.name'))
                            ->placeholder(__('filament/admin/customer_resource.name_placeholder'))
                            ->helperText(__('filament/admin/customer_resource.name_help'))
                            ->required()
                            ->minLength(2)
                            ->maxLength(255),
                        TextInput::make('nickname')
                            ->label('اسم الشهرة')
                            ->placeholder('أدخل اسم الشهرة أو الكنية')
                            ->helperText('اسم مختصر أو كنية للعميل')
                            ->maxLength(255)
                            ->nullable(),
                    ])
                    ->columns(2),
                Section::make('البيانات الشخصية والموقع')
                    ->description('البيانات الديموغرافية والموقع الجغرافي للعميل')
                    ->collapsible()
                    ->collapsed(true)
                    ->schema([
                        TextInput::make('national_id')
                            ->label('الرقم القومي')
                            ->maxLength(14)
                            ->unique('customers', 'national_id', ignoreRecord: true)
                            ->live(onBlur: true)
                            ->afterStateUpdated(function (callable $set, ?string $state) {
                                if (!empty($state) && strlen($state) === 14) {
                                    $parsed = NationalIdParser::parse($state);
                                    if ($parsed) {
                                        $set('date_of_birth', $parsed['birth_date']);
                                        $set('gender', $parsed['gender']);
                                        if ($parsed['governorate_id']) {
                                            $set('governorate_id', $parsed['governorate_id']);
                                        }
                                        if ($parsed['birth_date']) {
                                            $age = NationalIdParser::calculateAge($parsed['birth_date']);
                                            $set('age_display', $age);
                                        }
                                    }
                                }
                            })
                            ->helperText('سيتم استخراج تاريخ الميلاد والجنس والمحافظة تلقائياً')
                            ->columnSpanFull()
                            ->nullable(),

                        DatePicker::make('date_of_birth')
                            ->label('تاريخ الميلاد')
                            ->maxDate(now()->subYears(13))
                            ->live(onBlur: true)
                            ->afterStateUpdated(function (callable $set, $state) {
                                if ($state) {
                                    $age = NationalIdParser::calculateAge($state);
                                    $set('age_display', $age);
                                }
                            })
                            ->nullable(),

                        TextInput::make('age_display')
                            ->label('العمر')
                            ->disabled()
                            ->dehydrated(false)
                            ->placeholder('سيتم حسابه تلقائياً')
                            ->helperText('يتم حسابه من تاريخ الميلاد'),

                        Select::make('gender')
                            ->label('النوع')
                            ->options([
                                'male' => 'ذكر',
                                'female' => 'أنثى'
                            ])
                            ->nullable(),

                        Select::make('governorate_id')
                            ->label('المحافظة')
                            ->relationship('governorate', 'name_ar')
                            ->searchable()
                            ->preload()
                            ->live()
                            ->afterStateUpdated(fn(callable $set) => $set('city_id', null))
                            ->createOptionForm([
                                TextInput::make('code')
                                    ->label('الكود')
                                    ->required()
                                    ->unique()
                                    ->helperText('رمز المحافظة بالإنجليزية (مثال: cairo, giza)')
                                    ->maxLength(50),
                                TextInput::make('name_ar')
                                    ->label('الاسم بالعربية')
                                    ->required()
                                    ->maxLength(255),
                                TextInput::make('name_en')
                                    ->label('الاسم بالإنجليزية')
                                    ->required()
                                    ->maxLength(255),
                            ])
                            ->createOptionUsing(function (array $data): int {
                                return Governorate::create($data)->getKey();
                            })
                            ->nullable(),

                        Select::make('city_id')
                            ->label('المدينة')
                            ->relationship(
                                'city',
                                'name_ar',
                                fn($query, callable $get) =>
                                $query->where('governorate_id', $get('governorate_id'))
                            )
                            ->searchable()
                            ->preload()
                            ->createOptionForm([
                                Select::make('governorate_id')
                                    ->label('المحافظة')
                                    ->relationship('governorate', 'name_ar')
                                    ->required()
                                    ->default(fn(callable $get) => $get('../../governorate_id')),
                                TextInput::make('code')
                                    ->label('الكود')
                                    ->required()
                                    ->helperText('رمز المدينة بالإنجليزية (مثال: nasr_city)')
                                    ->maxLength(50),
                                TextInput::make('name_ar')
                                    ->label('الاسم بالعربية')
                                    ->required()
                                    ->maxLength(255),
                                TextInput::make('name_en')
                                    ->label('الاسم بالإنجليزية')
                                    ->nullable()
                                    ->maxLength(255),
                                TextInput::make('postal_code')
                                    ->label('الكود البريدي')
                                    ->nullable()
                                    ->maxLength(20),
                            ])
                            ->createOptionUsing(function (array $data): int {
                                return City::create($data)->getKey();
                            })
                            ->nullable()
                            ->visible(fn(callable $get) => filled($get('governorate_id'))),

                        TextInput::make('address_1')
                            ->label('العنوان الأول')
                            ->placeholder('أدخل العنوان الرئيسي')
                            ->maxLength(255)
                            ->nullable()
                            ->columnSpanFull(),

                        TextInput::make('address_2')
                            ->label('العنوان الثاني')
                            ->placeholder('أدخل عنوان إضافي (اختياري)')
                            ->maxLength(255)
                            ->nullable()
                            ->columnSpanFull(),

                        TextInput::make('postal_code')
                            ->label('الكود البريدي')
                            ->maxLength(20)
                            ->nullable(),
                    ])
                    ->columns(2),
                Section::make(__('filament/admin/customer_resource.contact_information'))
                    ->description(__('filament/admin/customer_resource.contact_information_description'))
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        TextInput::make('email')
                            ->label(__('filament/admin/customer_resource.email'))
                            ->placeholder(__('filament/admin/customer_resource.email_placeholder'))
                            ->helperText(__('filament/admin/customer_resource.email_help'))
                            ->email()
                            ->default(null),
                        TextInput::make('phone')
                            ->label(__('filament/admin/customer_resource.phone'))
                            ->placeholder(__('filament/admin/customer_resource.phone_placeholder'))
                            ->helperText(__('filament/admin/customer_resource.phone_help'))
                            ->tel()
                            ->default(null),
                    ]),
                Section::make(__('filament/admin/customer_resource.financial_information'))
                    ->description(__('filament/admin/customer_resource.financial_information_description'))
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        TextInput::make('credit_limit')
                            ->label(__('filament/admin/customer_resource.credit_limit'))
                            ->placeholder(__('filament/admin/customer_resource.credit_limit_placeholder'))
                            ->helperText(__('filament/admin/customer_resource.credit_limit_help'))
                            ->required()
                            ->numeric()
                            ->minValue(0)
                            ->step(1)
                            ->default(0.0)
                            ->prefix('EGP'),
                        TextInput::make('opening_balance')
                            ->label(__('filament/admin/customer_resource.opening_balance'))
                            ->placeholder(__('filament/admin/customer_resource.opening_balance_placeholder'))
                            ->helperText(__('filament/admin/customer_resource.opening_balance_help'))
                            ->required()
                            ->numeric()
                            ->step(0.01)
                            ->default(0.0)
                            ->prefix('EGP'),
                        TextInput::make('current_balance')
                            ->label(__('filament/admin/customer_resource.current_balance'))
                            ->placeholder(__('filament/admin/customer_resource.current_balance_placeholder'))
                            ->helperText(__('filament/admin/customer_resource.current_balance_help'))
                            ->required()
                            ->numeric()
                            ->minValue(0)
                            ->step(1)
                            ->default(0.0)
                            ->prefix('EGP')
                            ->disabled(),
                    ]),
                Section::make(__('filament/admin/farm_resource.plural_model_label'))
                    ->description('إضافة الحسابات الفرعية المرتبطة بهذا العميل')
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        Repeater::make('farms')
                            ->label(__('filament/admin/customer_resource.farms'))
                            ->relationship('farms')
                            ->schema([
                                TextInput::make('name')
                                    ->label('اسم المزرعة / الحساب الفرعي')
                                    ->required()
                                    ->maxLength(255)
                                    ->placeholder('أدخل اسم المزرعة')
                                    ->columnSpan(2),
                                TextInput::make('address')
                                    ->label('العنوان')
                                    ->maxLength(255)
                                    ->placeholder('أدخل عنوان المزرعة')
                                    ->columnSpan(1),
                                TextInput::make('phone')
                                    ->label('الهاتف')
                                    ->tel()
                                    ->maxLength(255)
                                    ->placeholder('أدخل رقم هاتف المزرعة')
                                    ->columnSpan(1),
                                TextInput::make('chicks_count')
                                    ->label('عدد الكتاكيت')
                                    ->numeric()
                                    ->minValue(0)
                                    ->default(0)
                                    ->placeholder('0')
                                    ->columnSpan(1),
                            ])
                            ->addActionLabel('إضافة حساب فرعي')
                            ->createItemButtonLabel('+ اضافة حساب فرعي جديد')
                            ->columnSpanFull()
                            ->columns(2)
                            ->defaultItems(0)
                            ->minItems(0)
                            ->orderColumn(false)
                            ->reorderable(false),
                    ]),
                Section::make(__('filament/admin/customer_resource.settings'))
                    ->description(__('filament/admin/customer_resource.settings_description'))
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        ToggleButtons::make('is_active')
                            ->label(__('filament/admin/customer_resource.is_active'))
                            ->helperText(__('filament/admin/customer_resource.is_active_help'))
                            ->boolean()
                            ->default(true)
                            ->required(),
                    ]),
            ]);
    }
}
