<?php

declare(strict_types=1);

namespace App\Services;

use Carbon\Carbon;
use Illuminate\Support\Facades\Http;
use Paynl\Alliance\Merchant;
use Paynl\Alliance\Statistics;
use Paynl\Config;
use Paynl\Error\Api;
use Paynl\Error\Error;
use Paynl\Error\Required\ApiToken;
use Paynl\Paymentmethods;

final class PaynlService
{
    public function __construct(
        protected string $tokenCode,
        protected string $apiToken,
    ) {
        Config::setTokenCode($this->tokenCode);
        Config::setApiToken($this->apiToken);
    }

    /**
     * @throws Error
     */
    public function statistics(): array
    {
        return Statistics::getStats([
            'startDate' => Carbon::now()->subMonths(3)->startOfMonth()->toDateTime(),
            'endDate' => Carbon::now()->subMonth()->endOfMonth()->toDateTime(),
        ])->getData();
    }

    public function merchants(): array
    {
        return Merchant::getList()->getData();
    }

    /**
     * @throws Error|ApiToken|Api
     */
    public function paymentMethods(string $serviceId): array
    {
        Config::setServiceId($serviceId);

        return Paymentmethods::getList();
    }

    public function terminals(string $merchantId): ?array
    {
        $response = Http::withHeaders([
            'authorization' => 'Basic ' . base64_encode(config('services.paynl.token_code') . ':' . config('services.paynl.api_token')),
            'accept' => 'application/json',
        ])->get('https://rest.pay.nl/v2/terminals', [
            'merchant[eq]' => $merchantId,
        ]);

        if ($response->status() === 200) {
            return $response->json();
        }

        return null;
    }
}
