<?php

declare(strict_types=1);

namespace App\Filament\Resources\Invoices\Schemas;

use App\Models\Invoice;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;

class InvoiceForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema->components([
            Section::make('اطلاعات فاکتور')
                ->schema([
                    \App\Filament\Components\Form\ProjectSelect::create()
                        ->required()
                        ->columnSpan(6),
                    \App\Filament\Components\Form\UserSelect::create()
                        ->label('دریافت‌کننده / کاربر')
                        ->columnSpan(6),
                    Select::make('type')
                        ->label('نوع تراکنش')
                        ->options([
                            Invoice::TYPE_INCOME => 'درآمد',
                            Invoice::TYPE_EXPENSE => 'هزینه',
                        ])
                        ->required()
                        ->columnSpan(4),
                    Select::make('status')
                        ->label('وضعیت')
                        ->options([
                            Invoice::STATUS_DRAFT => 'پیش‌نویس',
                            Invoice::STATUS_PENDING => 'در انتظار',
                            Invoice::STATUS_UNPAID => 'پرداخت نشده',
                            Invoice::STATUS_PAID => 'پرداخت شده',
                            Invoice::STATUS_APPROVED => 'تایید شده',
                            Invoice::STATUS_REJECTED => 'رد شده',
                            Invoice::STATUS_NEEDS_EDIT => 'نیاز به ویرایش',
                        ])
                        ->default(Invoice::STATUS_DRAFT)
                        ->required()
                        ->columnSpan(4),
                    TextInput::make('title')
                        ->label('نام تراکنش')
                        ->required()
                        ->columnSpan(4),
                    TextInput::make('number')
                        ->label('شماره فاکتور')
                        ->columnSpan(4),
                    TextInput::make('commission_percent')
                        ->label('درصد کارمزد')
                        ->numeric()
                        ->default(config('finance.commission_percent'))
                        ->columnSpan(4),
                    TextInput::make('tracking_code')
                        ->label('شماره پیگیری / مرجع')
                        ->columnSpan(4),
                    DatePicker::make('issued_at')
                        ->label('تاریخ تراکنش')
                        ->jalali()
                        ->default(now())
                        ->columnSpan(4),
                    DatePicker::make('due_at')
                        ->label('سررسید')
                        ->jalali()
                        ->columnSpan(4),
                    Select::make('payment_method')
                        ->label('روش دریافت (درآمد)')
                        ->options([
                            Invoice::PAYMENT_CASH => 'نقدی',
                            Invoice::PAYMENT_CHECK => 'چک',
                        ])
                        ->visible(fn ($get) => $get('type') === Invoice::TYPE_INCOME)
                        ->columnSpan(4),
                    TextInput::make('counterparty_name')
                        ->label('واسطه / خدمات‌دهنده')
                        ->columnSpan(6),
                    TextInput::make('counterparty_phone')
                        ->label('شماره تماس')
                        ->columnSpan(6),
                    Textarea::make('description')
                        ->label('شرح تراکنش')
                        ->rows(3)
                        ->columnSpan(12),
                    Textarea::make('admin_reason')
                        ->label('یادداشت ادمین')
                        ->rows(2)
                        ->columnSpan(12),
                ])
                ->columns(12)
                ->columnSpan(12),

            Section::make('آیتم‌های فاکتور')
                ->schema([
                    Repeater::make('items')
                        ->relationship()
                        ->schema([
                            TextInput::make('name')->label('نام آیتم')->required()->columnSpan(4),
                            TextInput::make('category')->label('دسته‌بندی')->columnSpan(2),
                            TextInput::make('subcategory')->label('زیر دسته')->columnSpan(2),
                            TextInput::make('unit')->label('واحد')->columnSpan(2),
                            TextInput::make('quantity')->label('مقدار')->numeric()->default(1)->columnSpan(2),
                            TextInput::make('unit_price')->label('قیمت واحد')->numeric()->default(0)->columnSpan(3),
                            TextInput::make('total')->label('مبلغ کل')->numeric()->default(0)->columnSpan(3),
                            Textarea::make('description')->label('توضیح')->rows(2)->columnSpan(12),
                            FileUpload::make('attachments')
                                ->label('پیوست‌ها')
                                ->multiple()
                                ->directory('files/invoices')
                                ->columnSpan(12),
                        ])
                        ->columns(12)
                        ->columnSpan(12)
                        ->addActionLabel('ثبت تراکنش جدید')
                        ->collapsible()
                        ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array {
                            if (! filled($data['total'] ?? null)) {
                                $data['total'] = (int) round(((float) ($data['quantity'] ?? 1)) * ((float) ($data['unit_price'] ?? 0)));
                            }

                            return $data;
                        })
                        ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array {
                            if (! filled($data['total'] ?? null)) {
                                $data['total'] = (int) round(((float) ($data['quantity'] ?? 1)) * ((float) ($data['unit_price'] ?? 0)));
                            }

                            return $data;
                        }),
                ])
                ->columns(12)
                ->columnSpan(12),

            Section::make('حمل و نقل')
                ->schema([
                    Toggle::make('meta.transport.enabled')->label('ثبت هزینه حمل و نقل')->columnSpan(12),
                    TextInput::make('meta.transport.amount')
                        ->label('مبلغ حمل و نقل')
                        ->numeric()
                        ->visible(fn ($get) => (bool) $get('meta.transport.enabled'))
                        ->columnSpan(4),
                    TextInput::make('meta.transport.origin')
                        ->label('آدرس مبدا')
                        ->visible(fn ($get) => (bool) $get('meta.transport.enabled'))
                        ->columnSpan(4),
                    TextInput::make('meta.transport.destination')
                        ->label('آدرس مقصد')
                        ->visible(fn ($get) => (bool) $get('meta.transport.enabled'))
                        ->columnSpan(4),
                    FileUpload::make('meta.transport.attachments')
                        ->label('تصویر حمل و نقل')
                        ->multiple()
                        ->directory('files/invoices/transport')
                        ->visible(fn ($get) => (bool) $get('meta.transport.enabled'))
                        ->columnSpan(12),
                    FileUpload::make('meta.attachments')
                        ->label('تصاویر فاکتور / رسید')
                        ->multiple()
                        ->directory('files/invoices')
                        ->columnSpan(12),
                ])
                ->columns(12)
                ->columnSpan(12),
        ])->columns(12);
    }
}
