<?php

namespace App\Filament\Resources\Accounting\JournalEntries\Schemas;

use Filament\Schemas\Schema;
use Filament\Forms\Components\Hidden;
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 App\Models\Accounting\ChartOfAccount;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Placeholder;
use Filament\Forms\Components\DateTimePicker;
use Filament\Schemas\Components\Utilities\Get;

class JournalEntryForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->components([
                Section::make(__('filament/admin/journal_entry_resource.entry_details'))
                    ->schema([
                        TextInput::make('entry_number')
                            ->label(__('filament/admin/journal_entry_resource.entry_number'))
                            ->required()
                            ->unique(ignoreRecord: true)
                            ->default(fn() => 'JE-' . date('Ymd') . '-' . str_pad(rand(1, 9999), 4, '0', STR_PAD_LEFT)),

                        DatePicker::make('entry_date')
                            ->label(__('filament/admin/journal_entry_resource.entry_date'))
                            ->required()
                            ->default(now()),

                        Select::make('reference_type')
                            ->label(__('filament/admin/journal_entry_resource.reference_type'))
                            ->options([
                                'manual' => __('filament/admin/journal_entry_resource.reference_type.manual'),
                                'sale' => __('filament/admin/journal_entry_resource.reference_type.sale'),
                                'purchase' => __('filament/admin/journal_entry_resource.reference_type.purchase'),
                                'sale_return' => __('filament/admin/journal_entry_resource.reference_type.sale_return'),
                                'purchase_return' => __('filament/admin/journal_entry_resource.reference_type.purchase_return'),
                                'payment' => __('filament/admin/journal_entry_resource.reference_type.payment'),
                                'receipt' => __('filament/admin/journal_entry_resource.reference_type.receipt'),
                                'adjustment' => __('filament/admin/journal_entry_resource.reference_type.adjustment'),
                                'opening_balance' => __('filament/admin/journal_entry_resource.reference_type.opening_balance'),
                                'closing_entry' => __('filament/admin/journal_entry_resource.reference_type.closing_entry'),
                            ])
                            ->default('manual')
                            ->required(),

                        Textarea::make('description')
                            ->label(__('filament/admin/journal_entry_resource.description'))
                            ->required()
                            ->rows(2)
                            ->columnSpanFull(),

                        Textarea::make('description_ar')
                            ->label(__('filament/admin/journal_entry_resource.description_ar'))
                            ->rows(2)
                            ->columnSpanFull(),

                        Textarea::make('notes')
                            ->label(__('filament/admin/journal_entry_resource.notes'))
                            ->rows(2)
                            ->columnSpanFull(),
                    ])->columns(2),

                Section::make(__('filament/admin/journal_entry_resource.lines'))
                    ->schema([
                        Repeater::make('lines')
                            ->relationship()
                            ->schema([
                                Select::make('account_id')
                                    ->label(__('filament/admin/journal_entry_resource.account_id'))
                                    ->options(function () {
                                        return ChartOfAccount::query()
                                            ->whereNotNull('parent_id')
                                            ->where('is_active', true)
                                            ->orderBy('code')
                                            ->get()
                                            ->mapWithKeys(function ($account) {
                                                $label = $account->name_ar ?: $account->name ?: "حساب #{$account->id}";
                                                return [$account->id => $label];
                                            });
                                    })
                                    ->searchable()
                                    ->required()
                                    ->columnSpan(2),

                                TextInput::make('debit')
                                    ->label(__('filament/admin/journal_entry_resource.debit'))
                                    ->numeric()
                                    ->default(0)
                                    ->minValue(0)
                                    ->live(onBlur: true)
                                    ->afterStateUpdated(function ($state, callable $set) {
                                        if ($state > 0) {
                                            $set('credit', 0);
                                        }
                                    }),

                                TextInput::make('credit')
                                    ->label(__('filament/admin/journal_entry_resource.credit'))
                                    ->numeric()
                                    ->default(0)
                                    ->minValue(0)
                                    ->live(onBlur: true)
                                    ->afterStateUpdated(function ($state, callable $set) {
                                        if ($state > 0) {
                                            $set('debit', 0);
                                        }
                                    }),

                                Textarea::make('notes')
                                    ->label(__('filament/admin/journal_entry_resource.notes'))
                                    ->rows(1)
                                    ->columnSpan(2),
                            ])
                            ->columns(4)
                            ->defaultItems(2)
                            ->minItems(2)
                            ->addActionLabel(__('Add Line'))
                            ->reorderable(false)
                            ->columnSpanFull(),

                        Placeholder::make('totals')
                            ->label('')
                            ->content(function (Get $get) {
                                $lines = $get('lines') ?? [];
                                $totalDebit = collect($lines)->sum('debit');
                                $totalCredit = collect($lines)->sum('credit');
                                $difference = $totalDebit - $totalCredit;

                                $status = $difference == 0
                                    ? '✅ ' . __('Balanced')
                                    : '⚠️ ' . __('Unbalanced');

                                return view('filament.components.journal-entry-totals', [
                                    'totalDebit' => number_format($totalDebit, 2),
                                    'totalCredit' => number_format($totalCredit, 2),
                                    'difference' => number_format(abs($difference), 2),
                                    'status' => $status,
                                    'isBalanced' => $difference == 0,
                                ]);
                            }),
                    ]),

                Hidden::make('created_by')
                    ->default(auth()->id()),
            ]);
    }
}
