<?php

namespace App\Traits;

use Log;
use App\Services\SessionService;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cookie;

trait SendsHRApiRequest
{
    /**
     * The base URL for the HR API.
     */
    protected static $baseUrl;

    /**
     * Initialize the base URL from configuration.
     */
    public function __construct()
    {
        self::$baseUrl = config('services.kedebah.hr_service_url');
    }

    /**
     * Send an API request.
     *
     * @param string $method
     * @param string $route
     * @param array $requestData
     * @return JsonResponse
     */
    protected function sendRequest(string $method, string $route, array $requestData = []): JsonResponse
    {
        $token = Cookie::get('auth_token');
        $response = Http::withHeaders([
                    'Accept' => 'application/json',
                    'Content-Type' => 'application/json',
                    'Authorization' => 'Bearer ' . $token,
                ])->$method(self::$baseUrl . $route, $requestData);
        return response()->json($response->object(), $response->status());
    }

    /**
     * Send a GET request.
     *
     * @param string $route
     * @param array $queryParams
     * @return JsonResponse
     */
    protected function sendGetRequest(string $route, array $queryParams = []): JsonResponse
    {
        return $this->sendRequest('get', $route, $queryParams);
    }

    /**
     * Send a POST request.
     *
     * @param string $route
     * @param array $requestData
     * @return JsonResponse
     */
    protected function sendPostRequest(string $route, array $requestData = []): JsonResponse
    {
        return $this->sendRequest('post', $route, $requestData);
    }

    /**
     * Send a PUT request.
     *
     * @param string $route
     * @param array $requestData
     * @return JsonResponse
     */
    protected function sendPutRequest(string $route, array $requestData = []): JsonResponse
    {
        return $this->sendRequest('put', $route, $requestData);
    }

    /**
     * Send a PATCH request.
     *
     * @param string $route
     * @param array $requestData
     * @return JsonResponse
     */
    protected function sendPatchRequest(string $route, array $requestData = []): JsonResponse
    {
        return $this->sendRequest('patch', $route, $requestData);
    }

    /**
     * Send a DELETE request.
     *
     * @param string $route
     * @return JsonResponse
     */
    protected function sendDeleteRequest(string $route, array $requestData = []): JsonResponse
    {
        return $this->sendRequest('delete', $route, $requestData);
    }
}
