<?php

namespace App\Filament\Resources;

use App\Filament\Resources\TourResource\Pages;
use App\Filament\Resources\TourResource\RelationManagers;
use App\Models\City;
use App\Models\Language;
use App\Models\Tour;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Group;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Tabs;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;

class TourResource extends Resource
{
    protected static ?string $model = Tour::class;
    protected static ?string $navigationGroup = 'Store';
    protected static ?int $navigationSort = 2;

    protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Tabs::make('Tabs')
                    ->tabs([
                        Tabs\Tab::make(__('admin/tour.form.tabs.informations'))
                            ->columns(3)
                            ->schema([
                                Group::make()
                                    ->columns(3)
                                    ->columnSpanFull()
                                    ->schema([
                                        Section::make(__('admin/tour.form.sections.basic'))
                                            ->columnSpan(2)
                                            ->schema([
                                                Select::make('city_id')
                                                    ->label(__('admin/tour.form.city'))
                                                    ->options(City::pluck('name', 'id')->toArray())
                                                    ->required()
                                                    ->validationMessages([
                                                        'required' => __('admin/tour.validation.city_id.required'),
                                                    ]),

                                                TextInput::make('name')
                                                    ->label(__('admin/tour.form.name'))
                                                    ->required()
                                                    ->validationMessages([
                                                        'required' => __('admin/tour.validation.name.required'),
                                                    ]),

                                                TextInput::make('youtube_video_id')
                                                    ->label(__('admin/tour.form.youtube_video_id'))
                                                    ->placeholder('Ex: dQw4w9WgXcQ'),

                                                TextInput::make('order_number')
                                                    ->label(__('admin/tour.form.order_number'))
                                                    ->numeric()
                                                    ->default(0)
                                                    ->helperText(__('admin/tour.form.order_number_help')),
                                            ]),

                                        Section::make(__('admin/tour.form.sections.media'))
                                            ->columnSpan(1)
                                            ->schema([
                                                FileUpload::make('image')
                                                    ->label(__('admin/tour.form.image'))
                                                    ->directory('tours')
                                                    ->preserveFilenames(),

                                                Toggle::make('is_active')
                                                    ->label(__('admin/tour.form.is_active'))
                                                    ->default(true)
                                                    ->validationMessages([
                                                        'required' => __('admin/tour.validation.is_active.required'),
                                                        'boolean' => __('admin/tour.validation.is_active.boolean'),
                                                    ]),

                                                Toggle::make('is_highlighted')
                                                    ->label(__('admin/tour.form.is_highlighted'))
                                                    ->default(true)
                                                    ->validationMessages([
                                                        'required' => __('admin/tour.validation.is_highlighted.required'),
                                                        'boolean' => __('admin/tour.validation.is_highlighted.boolean'),
                                                    ]),
                                            ]),
                                    ]),
                            ]),

                        Tabs\Tab::make(__('admin/tour.form.tabs.other_informations'))
                            ->columns(2)
                            ->schema([
                                Group::make()
                                    ->columnSpanFull()
                                    ->columns(2)
                                    ->schema([
                                        TextInput::make('duration')
                                            ->label(__('admin/tour.form.duration')),

                                        TextInput::make('max_participants')
                                            ->label(__('admin/tour.form.max_participants'))
                                            ->numeric()
                                            ->validationMessages([
                                                'numeric' => __('admin/tour.validation.max_participants.numeric'),
                                            ]),

                                        Radio::make('difficulty_level')
                                            ->label(__('admin/tour.form.difficulty_level'))
                                            ->options([
                                                '1' => __('admin/tour.form.difficulty.1'),
                                                '2' => __('admin/tour.form.difficulty.2'),
                                                '3' => __('admin/tour.form.difficulty.3')
                                            ])
                                            ->descriptions([
                                                '1' => __('admin/tour.form.difficulty_descriptions.1'),
                                                '2' => __('admin/tour.form.difficulty_descriptions.2'),
                                                '3' => __('admin/tour.form.difficulty_descriptions.3')
                                            ]),
                                    ]),
                            ]),

                        Tabs\Tab::make(__('admin/tour.form.tabs.bookings'))
                            ->columns(3)
                            ->schema([
                                Group::make()
                                    ->columnSpan(2)
                                    ->schema([
                                        Section::make()
                                            ->schema([
                                            ]),
                                    ]),
                            ]),

                        Tabs\Tab::make(__('admin/tour.form.tabs.images'))
                            ->schema([
                                FileUpload::make('images')
                                    ->label(__('admin/tour.form.images'))
                                    ->multiple()
                                    ->reorderable()
                                    ->image()
                                    ->preserveFilenames()
                                    ->directory('tours/gallery')
                                    ->validationMessages([
                                        'image' => __('admin/tour.validation.images.image'),
                                    ]),
                            ]),

                        Tabs\Tab::make(__('admin/tour.form.tabs.prices'))
                            ->schema([
                                \Filament\Forms\Components\Repeater::make('prices')
                                    ->label(__('admin/tour.form.prices'))
                                    ->schema([
                                        TextInput::make('max_persons')
                                            ->label(__('admin/tour.form.max_persons'))
                                            ->numeric()
                                            ->required(),
                                        TextInput::make('price')
                                            ->label(__('admin/tour.form.price'))
                                            ->numeric()
                                            ->required(),
                                    ])
                                    ->addActionLabel(__('admin/tour.form.add_price'))
                                    ->default([]),
                            ]),
                    ])->columnSpanFull(),
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('order_number')
                    ->label(__('admin/tour.table.columns.order_number'))
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),

                Tables\Columns\TextColumn::make('name')
                    ->label(__('admin/tour.table.columns.name'))
                    ->searchable(),

                Tables\Columns\TextColumn::make('city.name')
                    ->label(__('admin/tour.table.columns.city'))
                    ->searchable(),

                Tables\Columns\IconColumn::make('is_active')
                    ->label(__('admin/tour.table.columns.is_active'))
                    ->boolean(),

                Tables\Columns\IconColumn::make('is_highlighted')
                    ->label(__('admin/tour.table.columns.is_highlighted'))
                    ->boolean(),
            ])
            ->defaultSort('order_number', 'asc')
            ->filters([
                Tables\Filters\TernaryFilter::make('is_active')
                    ->label(__('admin/tour.table.filters.is_active')),

                Tables\Filters\TernaryFilter::make('is_highlighted')
                    ->label(__('admin/tour.table.filters.is_highlighted')),

                Tables\Filters\SelectFilter::make('city_id')
                    ->label(__('admin/tour.table.filters.city'))
                    ->options(City::pluck('name', 'id')->toArray()),
            ])
            ->actions([
                Tables\Actions\EditAction::make()
                    ->label(__('admin/tour.table.actions.edit')),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make()
                        ->label(__('admin/tour.table.bulk_actions.delete')),
                ]),
            ]);
    }

    public static function getRelations(): array
    {
        return [
            RelationManagers\TranslationsRelationManager::class,
        ];
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListTours::route('/'),
            'create' => Pages\CreateTour::route('/create'),
            'edit' => Pages\EditTour::route('/{record}/edit'),
        ];
    }

    public static function getModelLabel(): string
    {
        return __('tour.model_label');
    }

    public static function getPluralModelLabel(): string
    {
        return __('tour.plural_model_label');
    }

    public static function getNavigationLabel(): string
    {
        return __('admin/tour.navigation.label');
    }
}
