<?php

namespace App\Filament\Resources\Clients\Tables;

use App\Filament\Resources\Clients\ClientResource;
use App\Filament\Resources\Credits\CreditResource;
use App\Models\Client;
use App\Models\Credit;
use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Actions\ViewAction;
use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Filters\TernaryFilter;
use Filament\Tables\Table;
use Illuminate\Support\Facades\Auth;

class ClientsTable
{
    public static function configure(Table $table): Table
    {
        $isSuperAdmin = Auth::user()->hasRole('super_admin');

        return $table
            ->columns([
                TextColumn::make('name')
                    ->label('Cliente')
                    ->weight(FontWeight::Bold)
                    ->searchable()
                    ->sortable()
                    ->description(fn (Client $record): ?string => $record->identification),

                TextColumn::make('phone')
                    ->label('Teléfono')
                    ->searchable()
                    ->icon('heroicon-o-phone')
                    ->placeholder('—')
                    ->visibleFrom('md'),

                TextColumn::make('preferred_payment_method')
                    ->label('Pago')
                    ->badge()
                    ->formatStateUsing(fn (?string $state): string => match ($state) {
                        'virtual' => 'Virtual',
                        'physical' => 'Físico',
                        default => 'N/D',
                    })
                    ->color(fn (?string $state): string => match ($state) {
                        'virtual' => 'primary',
                        'physical' => 'warning',
                        default => 'gray',
                    })
                    ->sortable()
                    ->alignCenter(),

                TextColumn::make('active_credits_count')
                    ->label('Créditos')
                    ->badge()
                    ->counts([
                        'credits' => fn ($query) => $query->whereIn('status', Credit::ACTIVE_STATUSES),
                    ])
                    ->color(fn (int $state): string => match (true) {
                        $state === 0 => 'gray',
                        $state === 1 => 'success',
                        default => 'warning',
                    })
                    ->alignCenter()
                    ->sortable(),

                IconColumn::make('is_active')
                    ->label('Activo')
                    ->boolean()
                    ->sortable()
                    ->alignCenter(),

                TextColumn::make('company.name')
                    ->label('Compañía')
                    ->sortable()
                    ->visible(fn () => $isSuperAdmin)
                    ->visibleFrom('lg'),

                TextColumn::make('created_at')
                    ->label('Registrado')
                    ->date('d/m/Y')
                    ->sortable()
                    ->visibleFrom('lg'),
            ])

            ->filters([
                SelectFilter::make('is_active')
                    ->label('Estado')
                    ->options([
                        '1' => 'Activo',
                        '0' => 'Inactivo',
                    ]),

                TernaryFilter::make('has_active_credits')
                    ->label('Con créditos activos')
                    ->queries(
                        true: fn ($query) => $query->whereHas('credits', fn ($q) => $q->whereIn('status', Credit::ACTIVE_STATUSES)
                        ),
                        false: fn ($query) => $query->whereDoesntHave('credits', fn ($q) => $q->whereIn('status', Credit::ACTIVE_STATUSES)
                        ),
                    ),

                SelectFilter::make('preferred_payment_method')
                    ->label('Método de Pago')
                    ->options([
                        'physical' => 'Físico',
                        'virtual' => 'Virtual',
                    ]),

                ...($isSuperAdmin ? [
                    SelectFilter::make('company_id')
                        ->label('Compañía')
                        ->relationship('company', 'name'),
                ] : []),
            ])

            ->actions([
                Action::make('createCredit')
                    ->label('Nuevo Crédito')
                    ->icon('heroicon-o-plus-circle')
                    ->color('success')
                    ->url(fn (Client $record) => CreditResource::getUrl('create', ['client_id' => $record->id])
                    ),

                ViewAction::make()
                    ->icon('heroicon-o-eye'),

                EditAction::make()
                    ->icon('heroicon-m-pencil-square'),
            ])

            ->bulkActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make(),
                ]),
            ])

            ->defaultSort('name', 'asc')

            ->recordUrl(fn (Client $record) => ClientResource::getUrl('view', ['record' => $record])
            );
    }
}
