<?php

namespace App\Filament\Resources\Expenses;

use App\Filament\Resources\Expenses\Pages\CreateExpenses;
use App\Filament\Resources\Expenses\Pages\EditExpenses;
use App\Filament\Resources\Expenses\Pages\ListExpenses;
use App\Filament\Resources\Expenses\Pages\ViewExpenses;
use App\Filament\Resources\Expenses\Schemas\ExpenseForm;
use App\Filament\Resources\Expenses\Schemas\ExpenseInfolist;
use App\Filament\Resources\Expenses\Tables\ExpensesTable;
use App\Filament\Traits\MultiTenantResource;
use App\Models\Expense;
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 ExpenseResource extends Resource
{
    use MultiTenantResource;

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

    protected static ?string $modelLabel = 'Egreso';

    protected static ?string $pluralModelLabel = 'Egresos';

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

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

    protected static ?int $navigationSort = 11;

    /**
     * Solo admin y supervisor pueden ver egresos.
     * 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 egresos.
     */
    public static function canCreate(): bool
    {
        return Auth::user()->hasAnyRole(['super_admin', 'admin']);
    }

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

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

    public static function infolist(Schema $schema): Schema
    {
        return ExpenseInfolist::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 getPages(): array
    {
        return [
            'index' => ListExpenses::route('/'),
            'create' => CreateExpenses::route('/create'),
            'edit' => EditExpenses::route('/{record}/edit'),
            'view' => ViewExpenses::route('/{record}'),
        ];
    }
}
