<?php

namespace App\Filament\Resources;

use App\Filament\Resources\ReviewResource\Pages;
use App\Filament\Resources\ReviewResource\RelationManagers;
use App\Models\Review;
use App\Models\Tour;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;

class ReviewResource extends Resource
{
    protected static ?string $model = Review::class;

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

    protected static ?string $navigationGroup = 'Store';
    protected static ?int $navigationSort = 3;

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\Section::make(__('admin/review.form.review_info'))
                    ->schema([
                        Forms\Components\Select::make('tour_id')
                            ->label(__('admin/review.form.tour'))
                            ->relationship('tour', 'name')
                            ->required()
                            ->searchable(),

                        Forms\Components\TextInput::make('name')
                            ->label(__('admin/review.form.name'))
                            ->required()
                            ->maxLength(255),

                        Forms\Components\TextInput::make('email')
                            ->label(__('admin/review.form.email'))
                            ->email()
                            ->nullable()
                            ->maxLength(255),

                        Forms\Components\Select::make('rating')
                            ->label(__('admin/review.form.rating'))
                            ->options([
                                1 => '1 ' . __('admin/review.star'),
                                2 => '2 ' . __('admin/review.stars'),
                                3 => '3 ' . __('admin/review.stars'),
                                4 => '4 ' . __('admin/review.stars'),
                                5 => '5 ' . __('admin/review.stars'),
                            ])
                            ->required(),

                        Forms\Components\Textarea::make('review')
                            ->label(__('admin/review.form.review'))
                            ->required()
                            ->rows(4)
                            ->columnSpanFull(),

                        Forms\Components\FileUpload::make('images')
                            ->label(__('admin/review.form.images'))
                            ->multiple()
                            ->preserveFilenames()
                            ->directory('reviews')
                            ->image()
                            ->imageEditor()
                            ->columnSpanFull(),

                        Forms\Components\Toggle::make('is_approved')
                            ->label(__('admin/review.form.is_approved'))
                            ->default(false),
                    ])
                    ->columns(2),
            ]);
    }

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

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

                Tables\Columns\TextColumn::make('email')
                    ->label(__('admin/review.table.email'))
                    ->searchable(),

                Tables\Columns\TextColumn::make('rating')
                    ->label(__('admin/review.table.rating'))
                    ->formatStateUsing(fn (int $state): string => str_repeat('⭐', $state))
                    ->sortable(),

                Tables\Columns\TextColumn::make('review')
                    ->label(__('admin/review.table.review'))
                    ->limit(50)
                    ->searchable(),

                Tables\Columns\ImageColumn::make('images')
                    ->label(__('admin/review.table.images'))
                    ->circular()
                    ->stacked()
                    ->limit(3)
                    ->size(40),

                Tables\Columns\IconColumn::make('is_approved')
                    ->label(__('admin/review.table.is_approved'))
                    ->boolean(),

                Tables\Columns\TextColumn::make('created_at')
                    ->label(__('admin/review.table.created_at'))
                    ->dateTime()
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
            ])
            ->filters([
                Tables\Filters\SelectFilter::make('tour')
                    ->relationship('tour', 'name')
                    ->label(__('admin/review.filters.tour')),

                Tables\Filters\SelectFilter::make('rating')
                    ->options([
                        1 => '1 ' . __('admin/review.star'),
                        2 => '2 ' . __('admin/review.stars'),
                        3 => '3 ' . __('admin/review.stars'),
                        4 => '4 ' . __('admin/review.stars'),
                        5 => '5 ' . __('admin/review.stars'),
                    ])
                    ->label(__('admin/review.filters.rating')),

                Tables\Filters\TernaryFilter::make('is_approved')
                    ->label(__('admin/review.filters.is_approved')),
            ])
            ->actions([
                Tables\Actions\EditAction::make()
                    ->label(__('admin/review.actions.edit')),
                Tables\Actions\Action::make('assign_tour')
                    ->label(__('admin/review.actions.assign_tour'))
                    ->icon('heroicon-o-link')
                    ->color('success')
                    ->visible(fn ($record) => $record->tour_id === null)
                    ->form([
                        Forms\Components\Select::make('tour_id')
                            ->label(__('admin/review.form.tour'))
                            ->options(Tour::pluck('name', 'id'))
                            ->required()
                            ->searchable(),
                    ])
                    ->action(function ($record, $data) {
                        $record->update(['tour_id' => $data['tour_id']]);
                    }),
                Tables\Actions\DeleteAction::make()
                    ->label(__('admin/review.actions.delete')),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make()
                        ->label(__('admin/review.bulk_actions.delete')),
                ]),
            ])
            ->defaultSort('created_at', 'desc');
    }

    public static function getRelations(): array
    {
        return [
            //
        ];
    }

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

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

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

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