<?php

namespace App\Modules\Admin\Users;

use App\Models\AdminUser;
use App\Http\Resources\Admin\AdminUser as AdminUserResource;
use App\Traits\SearchTraits;
use App\Traits\SortingTraits;
use Illuminate\Support\Facades\DB;

class AdminUsers
{
    use SearchTraits;
    use SortingTraits;

    public function getData($payload)
    {
        // sorting
        $sortField = $this->sortField($payload, 'first_name'); // first_name = default column to search
        $sortOrder = $this->sortOrder($payload);

        // searching
        $nameSearch = $this->searchField($payload->first_name);
        $emailAddressSearch = $this->searchField($payload->email_address);
        $roleSearch = $payload->role;

        return AdminUserResource::collection(
            AdminUser::select(
                'conx_users.id',
                'conx_users.first_name',
                'conx_users.last_name',
                'conx_users.email_address',
                'conx_users.is_active',
                'conx_users.role')
                ->when(!empty($nameSearch), function ($query) use ($nameSearch) {
                    return $query->where(function ($query) use ($nameSearch) {
                        $query->where('conx_users.first_name', 'LIKE', $nameSearch . '%')
                            ->orWhere('conx_users.last_name', 'LIKE', $nameSearch . '%')
                            ->orWhere(DB::raw('CONCAT(conx_users.first_name, " ", conx_users.last_name)'), 'LIKE', $nameSearch . '%');
                    });
                })
                ->when(!empty($emailAddressSearch), function ($query) use ($emailAddressSearch) {
                    return $query->where('conx_users.email_address', 'LIKE', $emailAddressSearch . '%');
                })
                ->when(!empty($roleSearch), function ($query) use ($roleSearch) {
                    return $query->whereIn('conx_users.role', $roleSearch);
                })
                ->orderBy($sortField, $sortOrder)
                ->paginate(10)
        )->response()->setStatusCode(201);
    }

    public function getDetails($id)
    {
        return AdminUserResource::collection(
            AdminUser::select(
                'conx_users.id',
                'conx_users.first_name',
                'conx_users.last_name',
                'conx_users.email_address',
                'conx_users.is_active',
                'conx_users.role',
                'conx_users.phone_num',
                'conx_users.enable_2fa',
                'conx_users.profile_picture')
                ->where('conx_users.id', $id)
                ->limit(1)->get()
        )->response()->setStatusCode(201);
    }
}
