<?php

namespace App\Filament\Resources\Credits;

use App\Filament\Resources\Credits\Pages\CreateCredit;
use App\Filament\Resources\Credits\Pages\EditCredit;
use App\Filament\Resources\Credits\Pages\ListCredits;
use App\Filament\Resources\Credits\Pages\ViewCredit;
use App\Filament\Resources\Credits\Schemas\CreditForm;
use App\Filament\Resources\Credits\Schemas\CreditInfolist;
use App\Filament\Resources\Credits\Tables\CreditsTable;
use App\Filament\Traits\MultiTenantResource;
use App\Models\Client;
use App\Models\Credit;
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 CreditResource extends Resource
{
    use MultiTenantResource;

    protected static ?string $model = Credit::class;

    protected static ?string $modelLabel = 'Crédito';

    protected static ?string $pluralModelLabel = 'Créditos';

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

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

    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 Credit) {
            return null;
        }

        $client = $record->client;

        return $client instanceof Client
            ? "Crédito #{$record->code} · {$client->name}"
            : "Crédito #{$record->code}";
    }

    public static function canViewAny(): bool
    {
        return Auth::user()->hasAnyRole(['super_admin', 'admin', 'supervisor', 'collector']);
    }

    /*=========================================================
    | FORM
    =========================================================*/
    public static function form(Schema $schema): Schema
    {
        return CreditForm::configure($schema);
    }

    /*=========================================================
    | TABLE
    =========================================================*/
    public static function table(Table $table): Table
    {
        return CreditsTable::configure($table);
    }

    /*=========================================================
    | INFOLIST
    =========================================================*/
    public static function infolist(Schema $schema): Schema
    {
        return CreditInfolist::configure($schema);
    }

    /*=========================================================
    | QUERY MULTI-TENANT + EAGER LOADING
    =========================================================*/
    public static function getEloquentQuery(): Builder
    {
        $user = Auth::user();

        $query = parent::getEloquentQuery()
            ->with([
                'client',
                'company',
                'installments',
                'payments',
                'auditLogs',
                // Para la pestaña "Reemplazados" y la línea "sustituido por NNN"
                // bajo el estado: sin esto sería una consulta por fila.
                'children:id,parent_credit_id,company_credit_number',
            ]);

        // Super Admin ve todo
        if ($user->isSuperAdmin()) {
            return $query;
        }

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

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

        return $query;
    }

    /*=========================================================
    | MUTACIÓN DE CREATE
    =========================================================*/
    public static function mutateFormDataBeforeCreate(array $data): array
    {
        $user = Auth::user();

        $data['company_id'] = $data['company_id'] ?? $user->company_id;
        $data['created_by_user_id'] = $user->id;

        if (! isset($data['collector_user_id']) && $user->hasRole('collector')) {
            $data['collector_user_id'] = $user->id;
        }

        return $data;
    }

    /*=========================================================
    | RELATIONS (ELIMINADOS, USAMOS SOLO INFOLIST)
    =========================================================*/
    public static function getRelations(): array
    {
        return [];
    }

    /*=========================================================
    | PAGES
    =========================================================*/
    public static function getPages(): array
    {
        return [
            'index' => ListCredits::route('/'),
            'create' => CreateCredit::route('/create'),
            'edit' => EditCredit::route('/{record}/edit'),
            'view' => ViewCredit::route('/{record}'),
        ];
    }

    /*=========================================================
    | BEFORE DELETE → LIMPIEZA COMPLETA
    =========================================================*/
    public static function beforeDelete(Model $record): void
    {
        // Eliminación manejada desde acciones custom del table.
    }
}
