<?php

namespace App\Filament\Resources\Incomes;

use App\Filament\Resources\Incomes\Pages\CreateIncomes;
use App\Filament\Resources\Incomes\Pages\EditIncomes;
use App\Filament\Resources\Incomes\Pages\ListIncomes;
use App\Filament\Resources\Incomes\Pages\ViewIncomes;
use App\Filament\Resources\Incomes\Schemas\IncomeForm;
use App\Filament\Resources\Incomes\Schemas\IncomeInfolist;
use App\Filament\Resources\Incomes\Tables\IncomesTable;
use App\Filament\Traits\MultiTenantResource;
use App\Models\Income;
use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;
use UnitEnum;

class IncomeResource extends Resource
{
    use MultiTenantResource;

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

    protected static ?string $modelLabel = 'Ingreso';

    protected static ?string $pluralModelLabel = 'Ingresos';

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

    protected static string|BackedEnum|null $navigationIcon = 'heroicon-o-arrow-down-circle';

    protected static ?int $navigationSort = 10;

    /**
     * Solo admin y supervisor pueden ver ingresos.
     * Collector NO tiene acceso a información financiera sensible.
     */
    public static function canViewAny(): bool
    {
        return Auth::user()->hasAnyRole(['super_admin', 'admin', 'supervisor']);
    }

    /**
     * Solo admin puede crear ingresos manuales.
     * Los ingresos por pagos se crean automáticamente.
     */
    public static function canCreate(): bool
    {
        return Auth::user()->hasAnyRole(['super_admin', 'admin']);
    }

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

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

    public static function infolist(Schema $schema): Schema
    {
        return IncomeInfolist::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();

        $data['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();

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

        return $data;
    }

    public static function getPages(): array
    {
        return [
            'index' => ListIncomes::route('/'),
            'create' => CreateIncomes::route('/create'),
            'edit' => EditIncomes::route('/{record}/edit'),
            'view' => ViewIncomes::route('/{record}'),
        ];
    }
}
