<?php

namespace Dobare\Abstracts;

use WP_Error;
use WP_REST_Controller;

abstract class Dobare_REST_Controller extends WP_REST_Controller
{
	protected $namespace = 'dobare/v1';

	public function dobare_authorization_status_code(): int
	{

		$status = 401;

		if (is_user_logged_in()) {
			$status = 403;
		}

		return $status;
	}

	public static function dobare_remote_post(string $uri, array $body = array(), array $headers = array())
	{
		$headers['Content-Type'] = 'application/json';
		$headers['DOBARE-VERSION'] = DOBARE_VERSION;
		$headers['User-Agent'] = 'WordPress/' . get_bloginfo('version') . '; ' . home_url() . '; Dobare/' . DOBARE_VERSION;

		$args = array(
			'body' => wp_json_encode($body),
			'headers' => $headers,
			'timeout' => 30, // Increased timeout to 60 seconds
			'redirection' => 5,
			'httpversion' => '1.1',
			'blocking' => true,
			'sslverify' => true,
			'data_format' => 'body',
		);

		$endpoint = self::get_endpoint_url($uri);

		$response = wp_remote_post($endpoint, $args);

		if (is_wp_error($response)) {
			$error_message = $response->get_error_message();
			$error_code = $response->get_error_code();

			// Return more specific error messages
			$user_message = 'خطا در برقراری ارتباط با سرور. ';
			if (strpos($error_message, 'timeout') !== false || strpos($error_message, 'timed out') !== false) {
				$user_message .= 'مهلت زمانی درخواست به پایان رسید. لطفاً دوباره تلاش کنید.';
			} elseif (strpos($error_message, 'resolve') !== false || strpos($error_message, 'DNS') !== false) {
				$user_message .= 'خطا در رفع نام دامنه. لطفاً اتصال اینترنت خود را بررسی کنید.';
			} elseif (strpos($error_message, 'SSL') !== false || strpos($error_message, 'certificate') !== false) {
				$user_message .= 'خطا در گواهی امنیتی. لطفاً دوباره تلاش کنید.';
			} elseif (strpos($error_message, 'connect') !== false || strpos($error_message, 'connection') !== false) {
				$user_message .= 'عدم دسترسی به سرور. لطفاً اتصال اینترنت خود را بررسی کنید.';
			} else {
				$user_message .= 'لطفاً دوباره تلاش کنید.';
			}

			return new WP_Error('connection_error', $user_message, array('status' => 500));
		}

		$status = wp_remote_retrieve_response_code($response) ?: 500;
		$body   = wp_remote_retrieve_body($response);
		$data   = json_decode($body, true);

		return array('data' => $data, 'status' => $status);
	}

	public static function dobare_remote_get(string $uri, array $headers = array())
	{
		$headers['Content-Type'] = 'application/json';
		$headers['DOBARE-VERSION'] = DOBARE_VERSION;
		$headers['User-Agent'] = 'WordPress/' . get_bloginfo('version') . '; ' . home_url() . '; Dobare/' . DOBARE_VERSION;

		$args = array(
			'headers' => $headers,
			'timeout' => 60, // Increased timeout to 60 seconds
			'redirection' => 5,
			'httpversion' => '1.1',
			'blocking' => true,
			'sslverify' => true,
			'data_format' => 'body',
		);

		$endpoint = self::get_endpoint_url($uri);
		$response = wp_remote_get($endpoint, $args);

		if (is_wp_error($response)) {
			$error_message = $response->get_error_message();
			$error_code = $response->get_error_code();

			// Return more specific error messages
			$user_message = 'خطا در برقراری ارتباط با سرور. ';
			if (strpos($error_message, 'timeout') !== false || strpos($error_message, 'timed out') !== false) {
				$user_message .= 'مهلت زمانی درخواست به پایان رسید. لطفاً دوباره تلاش کنید.';
			} elseif (strpos($error_message, 'resolve') !== false || strpos($error_message, 'DNS') !== false) {
				$user_message .= 'خطا در رفع نام دامنه. لطفاً اتصال اینترنت خود را بررسی کنید.';
			} elseif (strpos($error_message, 'SSL') !== false || strpos($error_message, 'certificate') !== false) {
				$user_message .= 'خطا در گواهی امنیتی. لطفاً دوباره تلاش کنید.';
			} elseif (strpos($error_message, 'connect') !== false || strpos($error_message, 'connection') !== false) {
				$user_message .= 'عدم دسترسی به سرور. لطفاً اتصال اینترنت خود را بررسی کنید.';
			} else {
				$user_message .= 'لطفاً دوباره تلاش کنید.';
			}

			return new WP_Error('connection_error', $user_message, array('status' => 500));
		}

		$status = wp_remote_retrieve_response_code($response) ?: 500;
		$body   = wp_remote_retrieve_body($response);
		$data   = json_decode($body, true);

		return array('data' => $data, 'status' => $status);
	}

	public static function dobare_remote_patch(string $uri, array $body = array(), array $headers = array())
	{
		$headers['Content-Type'] = 'application/json';
		$headers['DOBARE-VERSION'] = DOBARE_VERSION;
		$headers['User-Agent'] = 'WordPress/' . get_bloginfo('version') . '; ' . home_url() . '; Dobare/' . DOBARE_VERSION;

		$args = array(
			'method' => 'PATCH',
			'body' => wp_json_encode($body),
			'headers' => $headers,
			'timeout' => 60,
			'redirection' => 5,
			'httpversion' => '1.1',
			'blocking' => true,
			'sslverify' => true,
			'data_format' => 'body',
		);

		$endpoint = self::get_endpoint_url($uri);
		$response = wp_remote_request($endpoint, $args);

		if (is_wp_error($response)) {
			$error_message = $response->get_error_message();
			$error_code = $response->get_error_code();

			// Return more specific error messages
			$user_message = 'خطا در برقراری ارتباط با سرور. ';
			if (strpos($error_message, 'timeout') !== false || strpos($error_message, 'timed out') !== false) {
				$user_message .= 'مهلت زمانی درخواست به پایان رسید. لطفاً دوباره تلاش کنید.';
			} elseif (strpos($error_message, 'resolve') !== false || strpos($error_message, 'DNS') !== false) {
				$user_message .= 'خطا در رفع نام دامنه. لطفاً اتصال اینترنت خود را بررسی کنید.';
			} elseif (strpos($error_message, 'SSL') !== false || strpos($error_message, 'certificate') !== false) {
				$user_message .= 'خطا در گواهی امنیتی. لطفاً دوباره تلاش کنید.';
			} elseif (strpos($error_message, 'connect') !== false || strpos($error_message, 'connection') !== false) {
				$user_message .= 'عدم دسترسی به سرور. لطفاً اتصال اینترنت خود را بررسی کنید.';
			} else {
				$user_message .= 'لطفاً دوباره تلاش کنید.';
			}

			return new WP_Error('connection_error', $user_message, array('status' => 500));
		}

		$status = wp_remote_retrieve_response_code($response) ?: 500;
		$body   = wp_remote_retrieve_body($response);
		$data   = json_decode($body, true);

		return array('data' => $data, 'status' => $status);
	}

	private static function get_endpoint_url(string $uri): string
	{
		if (preg_match('#^https?://#i', $uri) === 1) {
			return $uri;
		}

		$base = rtrim(DOBARE_BASE_URL, '/');
		$path = ltrim($uri, '/');

		return $base . '/' . $path;
	}
}
