<?php

namespace App\Repositories\Eloquent;

use App\Models\Professional;
use Illuminate\Support\Facades\DB;

class ApplicationManagementRepository
{
    public function paginate(array $filters = [])
    {
        return Professional::with(['user.profile', 'profession'])->where('has_applied', true)
            ->when($filters['q'] ?? null, fn ($query, $term) => $query->whereHas('user', fn ($user) => $user
                ->where('email', 'like', "%{$term}%")
                ->orWhereHas('profile', fn ($profile) => $profile->where('full_name', 'like', "%{$term}%"))))
            ->when($filters['status'] ?? null, fn ($query, $status) => $query->where('status', $status))
            ->latest()->paginate(10)->withQueryString();
    }

    public function stats(): array
    {
        $applications = Professional::where('has_applied', true);

        return [
            'total' => (clone $applications)->count(),
            'pending' => (clone $applications)->where('status', 'pending')->count(),
            'approved' => (clone $applications)->where('status', 'approved')->count(),
            'declined' => (clone $applications)->where('status', 'declined')->count(),
        ];
    }

    public function find(int $id): Professional
    {
        return Professional::with(['user.profile', 'profession', 'documents', 'office', 'schedules', 'educations', 'specialties.specialty'])
            ->where('has_applied', true)->findOrFail($id);
    }

    public function updateStatus(Professional $professional, string $status): Professional
    {
        DB::transaction(function () use ($professional, $status): void {
            $professional->update(['status' => $status]);
            $professional->user()->update(['status' => $status === 'approved' ? 'active' : 'deactivated']);
        });

        return $professional->refresh();
    }
}
