<?php

namespace App\Filament\Resources\FinancialOperations;

use App\Filament\Resources\FinancialOperations\Pages\CreateFinancialOperation;
use App\Filament\Resources\FinancialOperations\Pages\EditFinancialOperation;
use App\Filament\Resources\FinancialOperations\Pages\ListFinancialOperations;
use App\Filament\Resources\FinancialOperations\Pages\ViewFinancialOperation;
use App\Filament\Resources\FinancialOperations\Schemas\FinancialOperationForm;
use App\Filament\Resources\FinancialOperations\Schemas\FinancialOperationInfolist;
use App\Filament\Resources\FinancialOperations\Tables\FinancialOperationsTable;
use App\Filament\Traits\MultiTenantResource;
use App\Models\FinancialOperation;
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 FinancialOperationResource extends Resource
{
    use MultiTenantResource;

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

    protected static ?string $modelLabel = 'Operación financiera';

    protected static ?string $pluralModelLabel = 'Operaciones financieras';

    protected static string|UnitEnum|null $navigationGroup = 'Finanzas';

    protected static string|BackedEnum|null $navigationIcon = 'heroicon-o-arrows-right-left';

    protected static ?int $navigationSort = 12;

    // OJO: NO existe columna `name` en financial_operations — apuntar aquí dejaba el
    // encabezado/breadcrumb vacío. El título humano lo da getRecordTitle().
    protected static ?string $recordTitleAttribute = null;

    /**
     * Título legible (encabezado de Ver y breadcrumb).
     */
    public static function getRecordTitle(?Model $record): ?string
    {
        if (! $record instanceof FinancialOperation) {
            return null;
        }

        $tipo = match ($record->operation_type) {
            'credit_disbursement' => 'Desembolso',
            'credit_extension' => 'Extensión',
            'credit_refinance' => 'Refinanciación',
            'credit_restructure' => 'Reestructuración',
            'credit_renewal' => 'Renovación',
            'internal_adjustment' => 'Ajuste interno',
            default => 'Operación',
        };

        return "{$tipo} #{$record->getKey()}";
    }

    /**
     * Solo admin y supervisor pueden ver operaciones financieras.
     * Incluye extensiones, refinanciamientos, reestructuraciones, renovaciones.
     */
    public static function canViewAny(): bool
    {
        return Auth::user()->hasAnyRole(['super_admin', 'admin', 'supervisor']);
    }

    /**
     * Las operaciones financieras se crean automáticamente desde acciones de crédito.
     * No se permite creación manual desde este recurso.
     */
    public static function canCreate(): bool
    {
        return false;
    }

    /**
     * Las operaciones financieras son de solo lectura (registro histórico).
     */
    public static function canEdit($record): bool
    {
        return false;
    }

    /**
     * Las operaciones financieras no pueden eliminarse (integridad de auditoría).
     */
    public static function canDelete($record): bool
    {
        return false;
    }

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

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

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

    public static function getEloquentQuery(): Builder
    {
        $query = parent::getEloquentQuery();
        $user = Auth::user();

        if (! $user->isSuperAdmin()) {
            return $query->where('company_id', $user->company_id);
        }

        return $query;
    }

    public static function mutateFormDataBeforeCreate(array $data): array
    {
        $user = Auth::user();

        if (empty($data['company_id']) && $user->company_id) {
            $data['company_id'] = $user->company_id;
        }

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

        return $data;
    }

    public static function mutateFormDataBeforeSave(array $data): array
    {
        $user = Auth::user();

        if (empty($data['company_id']) && $user->company_id) {
            $data['company_id'] = $user->company_id;
        }

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

        return $data;
    }

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

    public static function getPages(): array
    {
        return [
            'index' => ListFinancialOperations::route('/'),
            'create' => CreateFinancialOperation::route('/create'),
            'view' => ViewFinancialOperation::route('/{record}'),
            'edit' => EditFinancialOperation::route('/{record}/edit'),
        ];
    }
}
