﻿<?php

class OvionLicenseClient
{
    public function __construct(
        private string $baseUrl,
        private string $licenseKey,
        private string $productSlug,
        private string $installationUuid,
        private string $environment = 'production'
    ) {
        $this->baseUrl = rtrim($baseUrl, '/');
    }

    public function activate(string $siteUrl, ?string $version = null): array
    {
        return $this->post('/activate', [
            'site_url' => $siteUrl,
            'domain' => parse_url($siteUrl, PHP_URL_HOST) ?: $siteUrl,
            'product_version' => $version,
            'client' => 'plain_php',
        ]);
    }

    public function check(string $siteUrl): array
    {
        return $this->post('/check', [
            'site_url' => $siteUrl,
            'domain' => parse_url($siteUrl, PHP_URL_HOST) ?: $siteUrl,
            'client' => 'plain_php',
        ]);
    }

    public function deactivate(string $siteUrl): array
    {
        return $this->post('/deactivate', [
            'site_url' => $siteUrl,
            'domain' => parse_url($siteUrl, PHP_URL_HOST) ?: $siteUrl,
            'client' => 'plain_php',
        ]);
    }

    public function updateCheck(string $siteUrl, ?string $version = null): array
    {
        return $this->post('/update-check', [
            'site_url' => $siteUrl,
            'domain' => parse_url($siteUrl, PHP_URL_HOST) ?: $siteUrl,
            'product_version' => $version,
            'client' => 'plain_php',
        ]);
    }

    private function post(string $path, array $payload): array
    {
        $payload = array_filter(array_merge($payload, [
            'license_key' => $this->licenseKey,
            'product_slug' => $this->productSlug,
            'installation_uuid' => $this->installationUuid,
            'environment' => $this->environment,
        ]), fn ($value) => $value !== null && $value !== '');

        $context = stream_context_create([
            'http' => [
                'method' => 'POST',
                'header' => "Content-Type: application/json\r\nAccept: application/json\r\n",
                'content' => json_encode($payload, JSON_THROW_ON_ERROR),
                'timeout' => 15,
            ],
        ]);

        $body = file_get_contents($this->baseUrl.$path, false, $context);

        return json_decode((string) $body, true, flags: JSON_THROW_ON_ERROR);
    }
}
