<?php

namespace App\Filament\Resources\Payments;

use App\Filament\Resources\Payments\Pages\CreatePayment;
use App\Filament\Resources\Payments\Pages\EditPayment;
use App\Filament\Resources\Payments\Pages\ListPayments;
use App\Filament\Resources\Payments\Pages\ViewPayment;
use App\Filament\Resources\Payments\Schemas\PaymentForm;
use App\Filament\Resources\Payments\Schemas\PaymentInfolist;
use App\Filament\Resources\Payments\Tables\PaymentsTable;
use App\Models\Client;
use App\Models\Credit;
use App\Models\Payment;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use UnitEnum;

class PaymentResource extends Resource
{
    protected static ?string $model = Payment::class;

    // Etiquetas y navegación
    protected static ?string $modelLabel = 'Pago';

    protected static ?string $pluralModelLabel = 'Pagos';

    protected static string|UnitEnum|null $navigationGroup = 'Gestión de Créditos';

    protected static string|BackedEnum|null $navigationIcon = 'heroicon-o-banknotes';

    protected static ?int $navigationSort = 2;

    protected static ?string $recordTitleAttribute = 'id';

    /**
     * Título legible (encabezado de Ver/Editar y breadcrumb). Antes salía el id desnudo.
     */
    public static function getRecordTitle(?Model $record): ?string
    {
        if (! $record instanceof Payment) {
            return null;
        }

        $credit = $record->credit;
        $client = $credit instanceof Credit ? $credit->client : null;

        return $client instanceof Client
            ? "Pago #{$record->getKey()} · {$client->name}"
            : "Pago #{$record->getKey()}";
    }

    public static function form(Schema $schema): Schema
    {
        return PaymentForm::configure($schema);
    }

    public static function infolist(Schema $schema): Schema
    {
        return PaymentInfolist::configure($schema);
    }

    public static function table(Table $table): Table
    {
        return PaymentsTable::configure($table);
    }

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

    /**
     * Solo admin, supervisor y collector pueden ver pagos.
     */
    public static function canViewAny(): bool
    {
        return Auth::user()->hasAnyRole(['super_admin', 'admin', 'supervisor', 'collector']);
    }

    // *** LÓGICA MULTI-TENANT EN LA CONSULTA ***
    public static function getEloquentQuery(): Builder
    {
        $user = Auth::user();
        $query = parent::getEloquentQuery()->with(['credit.client', 'credit.collector', 'installment', 'registeredBy']);

        if (! $user) {
            return $query;
        }

        if ($user->isSuperAdmin()) {
            // Super admin ve todos los pagos
            return $query;
        }

        // Filtrar por compañía
        $query->where('company_id', $user->company_id);

        // Collector: solo ve pagos de créditos asignados a él
        if ($user->hasRole('collector')) {
            $query->whereHas('credit', fn ($q) => $q->where('collector_user_id', $user->id));
        }

        return $query;
    }

    // *** LÓGICA MULTI-TENANT AL CREAR REGISTROS ***
    public static function mutateFormDataBeforeCreate(array $data): array
    {
        $user = Auth::user();

        if ($user) {
            // super admin puede elegir company_id desde el form
            if (! (method_exists($user, 'isSuperAdmin') && $user->isSuperAdmin())) {
                $data['company_id'] = $user->company_id;
            } else {
                // si el super admin no seleccionó nada, usamos su propia company_id por defecto
                $data['company_id'] = $data['company_id'] ?? $user->company_id;
            }

            $data['registered_by_user_id'] = $user->id;
        }

        return $data;
    }

    // *** LÓGICA AL ELIMINAR REGISTROS ***
    public static function beforeDelete($action, $record)
    {
        // Deshabilitado: la eliminación es manejada exclusivamente
        // por acciones custom desde PaymentsTable.
    }

    public static function getPages(): array
    {
        return [
            'index' => ListPayments::route('/'),
            'create' => CreatePayment::route('/create'),
            'view' => ViewPayment::route('/{record}'),
            'edit' => EditPayment::route('/{record}/edit'),
        ];
    }
}
