<?php

namespace WP2FA_Vendor\Clickatell;

class Rest
{
    /**
     * API base URL
     * @var string
     */
    const API_URL = 'https://platform.clickatell.com';
    /**
     * @var string
     */
    const HTTP_GET = 'GET';
    /**
     * @var string
     */
    const HTTP_POST = 'POST';
    /**
     * The CURL agent identifier
     * @var string
     */
    const AGENT = 'ClickatellV2/1.0';
    /**
     * Excepted HTTP statuses
     * @var array
     */
    const ACCEPTED_CODES = [200, 201, 202];
    /**
     * @var string
     */
    private $apiToken = '';
    /**
     * Create a new API connection
     *
     * @param string $apiToken The token found on your integration
     */
    public function __construct($apiToken)
    {
        $this->apiToken = $apiToken;
    }
    /**
     * Handle CURL response from Clickatell APIs
     *
     * @param string $result   The API response
     * @param int    $httpCode The HTTP status code
     *
     * @throws Exception
     * @return array
     */
    protected function handle($result, $httpCode)
    {
        // Check for non-OK statuses
        if (!\in_array($httpCode, static::ACCEPTED_CODES)) {
            // Decode JSON if possible, if this can't be decoded...something fatal went wrong
            // and we will just return the entire body as an exception.
            if ($error = \json_decode($result, \true)) {
                $error = $error['error'];
            } else {
                $error = $result;
            }
            throw new \WP2FA_Vendor\Clickatell\ClickatellException($error);
        } else {
            return \json_decode($result, \true);
        }
    }
    /**
     * Abstract CURL usage.
     *
     * @param string $uri     The endpoint
     * @param string $data    Array of parameters
     *
     * @return Decoder
     */
    protected function curl($uri, $data)
    {
        // Force data object to array
        $data = $data ? (array) $data : $data;
        $headers = ['Content-Type: application/json', 'Accept: application/json', 'Authorization: ' . $this->apiToken];
        // This is the clickatell endpoint. It doesn't really change so
        // it's safe for us to "hardcode" it here.
        $endpoint = static::API_URL . "/" . $uri;
        $curlInfo = \curl_version();
        $ch = \curl_init();
        \curl_setopt($ch, \CURLOPT_URL, $endpoint);
        \curl_setopt($ch, \CURLOPT_HEADER, 0);
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, \true);
        \curl_setopt($ch, \CURLOPT_HTTPHEADER, $headers);
        \curl_setopt($ch, \CURLOPT_USERAGENT, static::AGENT . ' curl/' . $curlInfo['version'] . ' PHP/' . \phpversion());
        // Specify the raw post data
        if ($data) {
            \curl_setopt($ch, \CURLOPT_POST, 1);
            \curl_setopt($ch, \CURLOPT_POSTFIELDS, \json_encode($data));
        }
        $result = \curl_exec($ch);
        $httpCode = \curl_getinfo($ch, \CURLINFO_HTTP_CODE);
        return $this->handle($result, $httpCode);
    }
    /**
     * @see https://www.clickatell.com/developers/api-documentation/rest-api-send-message/
     *
     * @param array $message The message parameters
     *
     * @return array
     */
    public function sendMessage(array $message)
    {
        $response = $this->curl('messages', $message);
        return $response['messages'];
    }
    /**
     * @see https://www.clickatell.com/developers/api-documentation/rest-api-status-callback/
     *
     * @param callable $callback The function to trigger with desired parameters
     * @param string   $file     The stream or file name, default to standard input
     *
     * @return void
     */
    public static function parseStatusCallback($callback, $file = \STDIN)
    {
        $body = \file_get_contents($file);
        $body = \json_decode($body, \true);
        $keys = ['apiKey', 'messageId', 'requestId', 'clientMessageId', 'to', 'from', 'status', 'statusDescription', 'timestamp'];
        if (!\array_diff($keys, \array_keys($body))) {
            $callback($body);
        }
        return;
    }
    /**
     * @see https://www.clickatell.com/developers/api-documentation/rest-api-reply-callback/
     *
     * @param callable $callback The function to trigger with desired parameters
     * @param string   $file     The stream or file name, default to standard input
     *
     * @return void
     */
    public static function parseReplyCallback($callback, $file = \STDIN)
    {
        $body = \file_get_contents($file);
        $body = \json_decode($body, \true);
        $keys = ['integrationId', 'messageId', 'replyMessageId', 'apiKey', 'fromNumber', 'toNumber', 'timestamp', 'text', 'charset', 'udh', 'network', 'keyword'];
        if (!\array_diff($keys, \array_keys($body))) {
            $callback($body);
        }
        return;
    }
}
