<?php

declare(strict_types=1);

namespace App\Filament\Resources\Reports\Schemas;

use App\Models\Report;
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\Schemas\Components\Group;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;

class ReportForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema->components([
            Group::make()
                ->schema([
                    Section::make('اطلاعات اصلی')
                        ->schema([
                            \App\Filament\Components\Form\ProjectSelect::create()
                                ->label('پروژه')
                                ->searchable(),
                            \App\Filament\Components\Form\ProducerSelect::create()
                                ->label('خدمات‌دهنده / تولیدکننده'),
                            \App\Filament\Components\Form\UserSelect::create()
                                ->label('کاربر'),
                            TextInput::make('title')
                                ->label('عنوان گزارش')
                                ->required()
                                ->maxLength(255)
                                ->columnSpan(12),
                            Select::make('type')
                                ->label('نوع گزارش')
                                ->options([
                                    Report::TYPE_GROWTH => 'گزارش رشد',
                                    Report::TYPE_HEALTH => 'گزارش سلامت',
                                    Report::TYPE_RATION => 'گزارش جیره',
                                ])
                                ->required()
                                ->columnSpan(6),
                            Select::make('report_type')
                                ->label('نوع گزارش (جزئی)')
                                ->options([
                                    'weighing' => 'وزن‌کشی',
                                    'growth' => 'رشد',
                                    'health' => 'سلامت',
                                ])
                                ->searchable()
                                ->columnSpan(6),
                            Select::make('unit')
                                ->label('واحد ثبتی')
                                ->options([
                                    Report::UNIT_KG => 'کیلوگرم (kg)',
                                    Report::UNIT_M => 'متر (m)',
                                    Report::UNIT_HEAD => 'راس (head)',
                                ])
                                ->columnSpan(6),
                            TextInput::make('period')
                                ->label('دوره گزارش')
                                ->maxLength(255)
                                ->columnSpan(6),
                            DatePicker::make('date')
                                ->label('تاریخ گزارش')
                                ->required()
                                ->default(now())
                                ->jalali()
                                ->columnSpan(12),
                            \App\Filament\Components\Form\ProductSelect::create()
                                ->label('محصول (تک)'),
                        ])
                        ->columns(12)
                        ->columnSpan(12),
                    Section::make('آیتم‌های گزارش رشد (بازه واحد برای هر محصول)')
                        ->schema([
                            Repeater::make('items')
                                ->relationship()
                                ->schema([
                                    TextInput::make('group_name')
                                        ->label('دسته/گروه')
                                        ->placeholder('مثلاً گروه A')
                                        ->columnSpan(3),
                                    \App\Filament\Components\Form\ProductSelect::create()
                                        ->label('محصول')
                                        ->columnSpan(3),
                                    TextInput::make('unit')->label('واحد')->placeholder('kg')->columnSpan(2),
                                    TextInput::make('min_value')->label('کمترین')->numeric()->columnSpan(2),
                                    TextInput::make('max_value')->label('بیشترین')->numeric()->columnSpan(2),
                                    TextInput::make('value')->label('مقدار تکی')->numeric()->columnSpan(2),
                                    TextInput::make('avg_value')->label('میانگین')->numeric()->helperText('در صورت خالی بودن از کمینه/بیشینه محاسبه می‌شود')->columnSpan(2),
                                    Textarea::make('action_note')->label('دستور رسیدگی/حذف')->rows(2)->columnSpan(12),
                                ])
                                ->columns(12)
                                ->columnSpan(12)
                                ->addActionLabel('افزودن محصول/بازه')
                                ->collapsible()
                                ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array {
                                    if (! filled($data['avg_value'] ?? null) && filled($data['min_value'] ?? null) && filled($data['max_value'] ?? null)) {
                                        $data['avg_value'] = ((float) $data['min_value'] + (float) $data['max_value']) / 2;
                                    }

                                    return $data;
                                })
                                ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array {
                                    if (! filled($data['avg_value'] ?? null) && filled($data['min_value'] ?? null) && filled($data['max_value'] ?? null)) {
                                        $data['avg_value'] = ((float) $data['min_value'] + (float) $data['max_value']) / 2;
                                    }

                                    return $data;
                                }),
                        ])
                        ->columns(12)
                        ->columnSpan(12)
                        ->visible(fn ($get) => (int) $get('type') === Report::TYPE_GROWTH),
                    Section::make('فاکتور (اختیاری - گزارش رشد)')
                        ->schema([
                            \Filament\Forms\Components\Toggle::make('create_invoice')
                                ->label('ثبت فاکتور')
                                ->columnSpan(12),
                            TextInput::make('total_cost')
                                ->label('مبلغ کل فاکتور')
                                ->numeric()
                                ->visible(fn ($get) => (bool) $get('create_invoice'))
                                ->columnSpan(6),
                            FileUpload::make('invoice_image')
                                ->label('تصویر فاکتور')
                                ->image()
                                ->directory('files/reports/invoices')
                                ->visible(fn ($get) => (bool) $get('create_invoice'))
                                ->columnSpan(6),
                            Repeater::make('invoiceItems')
                                ->relationship()
                                ->schema([
                                    TextInput::make('title')->label('عنوان')->required()->columnSpan(8),
                                    TextInput::make('amount')->label('مبلغ')->numeric()->columnSpan(4),
                                ])
                                ->columns(12)
                                ->visible(fn ($get) => (bool) $get('create_invoice'))
                                ->columnSpan(12)
                                ->addActionLabel('افزودن آیتم فاکتور'),
                        ])
                        ->columns(12)
                        ->columnSpan(12)
                        ->visible(fn ($get) => (int) $get('type') === Report::TYPE_GROWTH),
                    Section::make('گزارش و یادداشت')
                        ->schema([
                            \App\Filament\Components\Form\DescTextarea::create()
                                ->label('یادداشت'),
                            Textarea::make('written_report')
                                ->label('گزارش مکتوب')
                                ->rows(4)
                                ->columnSpan(12),
                        ])
                        ->columns(12)
                        ->columnSpan(12),
                    Section::make('فایل‌ها و اسناد')
                        ->schema([
                            FileUpload::make('attachments')
                                ->label('تصاویر / ویدئو')
                                ->multiple()
                                ->acceptedFileTypes([
                                    'image/jpeg',
                                    'image/png',
                                    'image/webp',
                                    'image/gif',
                                    'video/mp4',
                                    'video/quicktime',
                                    'video/webm',
                                ])
                                ->directory('files/reports/attachments')
                                ->columnSpan(12),
                            FileUpload::make('documents')
                                ->label('اسناد')
                                ->multiple()
                                ->directory('files/reports/documents')
                                ->columnSpan(12),
                        ])
                        ->columns(12)
                        ->columnSpan(12),
                    Section::make('وضعیت')
                        ->schema([
                            Select::make('status')
                                ->label('وضعیت')
                                ->options([
                                    'draft' => 'پیش‌نویس',
                                    'published' => 'منتشر شده',
                                    'archived' => 'بایگانی شده',
                                ])
                                ->default('draft')
                                ->columnSpan(6),
                            Select::make('workflow_status')
                                ->label('وضعیت رسیدگی')
                                ->options([
                                    Report::WORKFLOW_PENDING => 'انتظار',
                                    Report::WORKFLOW_APPROVED => 'تایید',
                                    Report::WORKFLOW_REJECTED => 'رد',
                                    Report::WORKFLOW_NEEDS_EDIT => 'ویرایش',
                                ])
                                ->default(Report::WORKFLOW_PENDING)
                                ->columnSpan(6),
                        ])
                        ->columns(12)
                        ->columnSpan(12),
                ])
                ->columns(12)
                ->columnSpan(8),
            Group::make()
                ->schema([
                    Section::make('اطلاعات سیستم')
                        ->schema([
                            \App\Filament\Components\Form\CreatedBySelect::create()->required(),
                            \App\Filament\Components\Form\UpdatedBySelect::create(),
                        ])
                        ->columns(12)
                        ->columnSpan(12),
                ])
                ->columns(12)
                ->columnSpan(4),
        ])
        ->columns(12);
    }
}

