<?php

namespace App\Repositories\Eloquent;

use App\Models\AdminUser;

class AdminUserManagementRepository
{
    public function paginate(array $filters = [])
    {
        return AdminUser::query()
            ->when($filters['q'] ?? null, fn ($query, $term) => $query->where(fn ($search) => $search->where('email', 'like', "%{$term}%")->orWhere('name', 'like', "%{$term}%")))
            ->when($filters['status'] ?? null, fn ($query, $status) => $query->where('status', $status))
            ->latest()->paginate(10)->withQueryString();
    }

    public function stats(): array
    {
        $admins = AdminUser::query();

        return [
            'total' => (clone $admins)->count(),
            'active' => (clone $admins)->where('status', 'active')->count(),
            'system' => (clone $admins)->where('role', 'system_admin')->count(),
        ];
    }

    public function create(array $data): AdminUser
    {
        return AdminUser::create([
            'name' => trim($data['name']),
            'email' => strtolower($data['email']),
            'password' => $data['password'],
            'role' => $data['role'] === 'System Admin' ? 'system_admin' : 'admin',
            'status' => 'active',
            'force_change_password' => true,
        ]);
    }

    public function update(AdminUser $adminUser, array $data): AdminUser
    {
        $adminUser->update($data);

        return $adminUser->refresh();
    }

    public function activeSystemAdminsExcept(AdminUser $adminUser): int
    {
        return AdminUser::where('status', 'active')
            ->where('role', 'system_admin')
            ->where('id', '!=', $adminUser->id)
            ->count();
    }
}
