<?php
declare(strict_types=1);

class Cloudflare {
    public static function request(string $apiToken, string $endpoint, string $method = 'GET', ?array $data = null): ?array {
        $url = "https://api.cloudflare.com/client/v4/" . ltrim($endpoint, '/');
        $ch = curl_init($url);
        
        $headers = [
            "Authorization: Bearer " . trim($apiToken),
            "Content-Type: application/json"
        ];

        $opts = [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CUSTOMREQUEST  => $method,
            CURLOPT_HTTPHEADER     => $headers,
            CURLOPT_TIMEOUT        => 12,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false
        ];

        if ($data !== null) {
            $opts[CURLOPT_POSTFIELDS] = json_encode($data);
        }

        curl_setopt_array($ch, $opts);
        $response = curl_exec($ch);
        curl_close($ch);

        $json = json_decode((string)$response, true);
        return $json;
    }

    public static function getZones(string $apiToken): array {
        $res = self::request($apiToken, "zones?per_page=50");
        return ($res && !empty($res['success'])) ? ($res['result'] ?? []) : [];
    }

    public static function getDnsRecords(string $apiToken, string $zoneId): array {
        $res = self::request($apiToken, "zones/{$zoneId}/dns_records?type=A&per_page=100");
        return ($res && !empty($res['success'])) ? ($res['result'] ?? []) : [];
    }

    public static function updateRecord(string $apiToken, string $zoneId, string $recordId, string $domainName, string $newIp, bool $proxied = false, ?string &$errorMsg = null): bool {
        $payload = [
            'type'    => 'A',
            'name'    => $domainName,
            'content' => $newIp,
            'ttl'     => 1,
            'proxied' => $proxied
        ];

        // با هر دو متد PATCH و PUT تست می‌شود
        $res = self::request($apiToken, "zones/{$zoneId}/dns_records/{$recordId}", 'PATCH', $payload);

        if (!$res || empty($res['success'])) {
            $res = self::request($apiToken, "zones/{$zoneId}/dns_records/{$recordId}", 'PUT', $payload);
        }

        if ($res && !empty($res['success'])) {
            return true;
        }

        if ($res && !empty($res['errors'])) {
            $errorMsg = json_encode($res['errors'], JSON_UNESCAPED_UNICODE);
        } else {
            $errorMsg = "عدم دریافت پاسخ معتبر از API کلودفلر";
        }

        return false;
    }
}