<?php

declare(strict_types=1);

namespace App\Filament\Resources\Partners;

use App\Filament\Resources\Partners\Pages\CreatePartner;
use App\Filament\Resources\Partners\Pages\EditPartner;
use App\Filament\Resources\Partners\Pages\ListPartners;
use App\Filament\Resources\Partners\Pages\ViewPartner;
use App\Filament\Resources\Partners\RelationManagers\ContributionsRelationManager;
use App\Filament\Resources\Partners\RelationManagers\ProfitDistributionsRelationManager;
use App\Filament\Resources\Partners\RelationManagers\WithdrawalsRelationManager;
use App\Filament\Resources\Partners\Schemas\PartnerForm;
use App\Filament\Resources\Partners\Schemas\PartnerInfolist;
use App\Filament\Resources\Partners\Tables\PartnersTable;
use App\Filament\Traits\MultiTenantResource;
use App\Models\Partner;
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 PartnerResource extends Resource
{
    use MultiTenantResource;

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

    protected static ?string $modelLabel = 'Socio / Inversionista';

    protected static ?string $pluralModelLabel = 'Socios e Inversionistas';

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

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

    protected static ?int $navigationSort = 9;

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

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

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

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

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

        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;
        }

        return $data;
    }

    public static function getRelations(): array
    {
        return [
            ContributionsRelationManager::class,
            WithdrawalsRelationManager::class,
            ProfitDistributionsRelationManager::class,
        ];
    }

    public static function getPages(): array
    {
        return [
            'index' => ListPartners::route('/'),
            'create' => CreatePartner::route('/create'),
            'edit' => EditPartner::route('/{record}/edit'),
            'view' => ViewPartner::route('/{record}'),
        ];
    }
}
