<?php

namespace App\Services;

use Illuminate\Support\Facades\Http;

class BcaService
{
    protected $apiKey;
    protected $apiSecret;
    protected $baseUrl = 'https://sandbox.bca.co.id';

    public function __construct()
    {
        $this->apiKey = env('BCA_API_KEY');
        $this->apiSecret = env('BCA_API_SECRET');
    }

    public function getAccessToken()
    {
        $response = Http::asForm()
            ->withBasicAuth($this->apiKey, $this->apiSecret)
            ->post($this->baseUrl . '/api/oauth/token', [
                'grant_type' => 'client_credentials'
            ]);

        return $response->json()['access_token'];
    }

    private function generateSignature($method, $relativeUrl, $token, $body, $timestamp)
    {
        $bodyHash = hash('sha256', $body);

        $stringToSign = strtoupper($method) . ':' .
                        $relativeUrl . ':' .
                        $token . ':' .
                        strtolower($bodyHash) . ':' .
                        $timestamp;

        return hash_hmac('sha256', $stringToSign, $this->apiSecret);
    }

    public function getAccount($corporateId, $accountNumber)
    {
        $token = $this->getAccessToken();

        $method = 'GET';
        $relativeUrl = "/banking/v3/corporates/$corporateId/accounts/$accountNumber";
        $timestamp = now()->format('Y-m-d\TH:i:s.vP');
        $body = '';

        $signature = $this->generateSignature(
            $method,
            $relativeUrl,
            $token,
            $body,
            $timestamp
        );

        $response = Http::withHeaders([
            'Authorization' => 'Bearer ' . $token,
            'X-BCA-Key' => $this->apiKey,
            'X-BCA-Timestamp' => $timestamp,
            'X-BCA-Signature' => $signature,
        ])->get($this->baseUrl . $relativeUrl);

        return $response->json();
    }
}