<?php

declare(strict_types=1);

namespace App\Filament\Resources\MediaItems\Schemas;

use App\Filament\Support\SelectOptionLabels;
use App\Models\MediaCategory;
use App\Models\MediaItem;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;

class MediaItemForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema->components([
            Section::make('پروژه و نوع فایل')
                ->schema([
                    \App\Filament\Components\Form\ProjectSelect::create()
                        ->label('پروژه')
                        ->searchable(),
                    Select::make('type')
                        ->label('نوع فایل')
                        ->options(MediaItem::typeOptions())
                        ->required()
                        ->live()
                        ->columnSpan(6),
                ])
                ->columns(12),

            Section::make('اطلاعات سند (فقط برای اسناد)')
                ->schema([
                    DateTimePicker::make('start_at')->label('تاریخ/زمان شروع')->jalali()->columnSpan(4),
                    DateTimePicker::make('end_at')->label('تاریخ/زمان خاتمه')->jalali()->columnSpan(4),
                    TextInput::make('contract_number')->label('شماره قرارداد/ثبت')->columnSpan(4),
                    TextInput::make('company_name')->label('نام مجموعه/واسطه/شرکت')->columnSpan(6),
                    TextInput::make('contact_phone')->label('شماره تماس')->tel()->columnSpan(6),
                ])
                ->columns(12)
                ->visible(fn ($get) => $get('type') === MediaItem::TYPE_DOCUMENT),

            Section::make('فایل و دسته‌بندی')
                ->schema([
                    FileUpload::make('file_path')
                        ->label('انتخاب/بارگذاری فایل')
                        ->directory('files/media')
                        ->image(fn ($get) => in_array($get('type'), [MediaItem::TYPE_IMAGE, null]))
                        ->acceptedFileTypes(fn ($get) => match ($get('type')) {
                            MediaItem::TYPE_VIDEO => ['video/*'],
                            MediaItem::TYPE_DOCUMENT => ['application/pdf', 'image/*'],
                            default => ['image/*'],
                        })
                        ->columnSpan(12),
                    TextInput::make('name')->label('نام فایل')->maxLength(255)->columnSpan(6),
                    DatePicker::make('created_at_file')->label('تاریخ ایجاد فایل')->jalali()->columnSpan(6),
                    Select::make('category_id')
                        ->label('دسته‌بندی')
                        ->options(function ($get) {
                            $type = $get('type');
                            $catType = ($type === MediaItem::TYPE_DOCUMENT) ? MediaCategory::TYPE_DOCUMENT : MediaCategory::TYPE_GALLERY;
                            return SelectOptionLabels::mediaCategoryOptions(
                                MediaCategory::query()->where('type', $catType)->whereNull('parent_id')
                            );
                        })
                        ->searchable()
                        ->live()
                        ->columnSpan(6),
                    Select::make('subcategory_id')
                        ->label('زیر دسته‌بندی')
                        ->options(function ($get) {
                            $parentId = $get('category_id');
                            if (! $parentId) {
                                return [];
                            }
                            return SelectOptionLabels::mediaCategoryOptions(
                                MediaCategory::query()->where('parent_id', $parentId)
                            );
                        })
                        ->searchable()
                        ->columnSpan(6),
                ])
                ->columns(12),

            Section::make('موقعیت و توضیحات')
                ->schema([
                    TextInput::make('gps_lat')
                        ->label('عرض جغرافیایی')
                        ->numeric()
                        ->placeholder('GPS')
                        ->columnSpan(4)
                        ->visible(fn ($get) => $get('type') !== MediaItem::TYPE_DOCUMENT),
                    TextInput::make('gps_lng')
                        ->label('طول جغرافیایی')
                        ->numeric()
                        ->placeholder('GPS')
                        ->columnSpan(4)
                        ->visible(fn ($get) => $get('type') !== MediaItem::TYPE_DOCUMENT),
                    Textarea::make('description')->label('توضیحات')->rows(3)->columnSpan(12),
                    Textarea::make('notes')->label('یادداشت‌ها')->rows(2)->columnSpan(12),
                    TextInput::make('tags')
                        ->label('برچسب‌ها')
                        ->placeholder('با کاما جدا کنید')
                        ->columnSpan(12)
                        ->dehydrateStateUsing(fn ($state) => is_string($state) && $state !== '' ? array_map('trim', explode(',', $state)) : (is_array($state) ? $state : null))
                        ->afterStateHydrated(fn ($component, $state) => $component->state(is_array($state) ? implode(', ', $state) : (string) ($state ?? ''))),
                ])
                ->columns(12),

            Section::make('وضعیت')
                ->schema([
                    Select::make('status')
                        ->label('وضعیت')
                        ->options(MediaItem::statusOptions())
                        ->default(MediaItem::STATUS_PENDING)
                        ->columnSpan(6),
                ])
                ->columns(12)
                ->visible(fn ($record) => $record !== null),
        ]);
    }
}
