<?php

namespace Blocksy;

class ExtensionsManagerApi {
	public function __construct() {
		$this->attach_ajax_actions();
	}

	protected $ajax_actions = [
		'blocksy_extensions_status',
		'blocksy_extension_activate',
		'blocksy_extension_deactivate',
		'blocksy_flush_permalinks'
	];

	public function blocksy_flush_permalinks() {
		if (! check_ajax_referer('ct-dashboard', 'nonce', false)) {
			wp_send_json_error('nonce');
		}

		$this->check_capability('edit_theme_options');

		flush_rewrite_rules();

		wp_send_json_success();
	}

	public function blocksy_extensions_status() {
		if (! check_ajax_referer('ct-dashboard', 'nonce', false)) {
			wp_send_json_error('nonce');
		}

		$this->check_capability('edit_theme_options');

		$manager = Plugin::instance()->extensions;

		$maybe_input = json_decode(file_get_contents('php://input'), true);

		$data = $manager->get_extensions([
			'require_config' => true
		]);

		if (
			$maybe_input
			&&
			isset($maybe_input['extension'])
			&&
			isset($maybe_input['extAction'])
		) {
			$ext_preboot = $manager->get($maybe_input['extension'], [
				'type' => 'preboot'
			]);

			if (method_exists(
				$ext_preboot, 'ext_action'
			)) {
				$result = $ext_preboot->ext_action($maybe_input['extAction']);

				if ($result) {
					$data[$maybe_input['extension']]['data'] = $result;
				}
			}
		}

		wp_send_json_success($data);
	}

	public function blocksy_extension_activate() {
		if (! check_ajax_referer('ct-dashboard', 'nonce', false)) {
			wp_send_json_error('nonce');
		}

		$this->check_capability('edit_theme_options');

		$manager = Plugin::instance()->extensions;

		$manager->activate_extension($this->get_extension_from_request());

		wp_send_json_success();
	}

	public function blocksy_extension_deactivate() {
		if (! check_ajax_referer('ct-dashboard', 'nonce', false)) {
			wp_send_json_error('nonce');
		}

		$this->check_capability('edit_theme_options');

		$manager = Plugin::instance()->extensions;

		$manager->deactivate_extension($this->get_extension_from_request());

		wp_send_json_success();
	}

	public function check_capability($cap = 'install_plugins') {
		$manager = Plugin::instance()->extensions;

		if (! $manager->can($cap)) {
			wp_send_json_error();
		}

		return true;
	}

	public function get_extension_from_request() {
		if ( ! isset( $_POST['ext'] ) ) {
			wp_send_json_error();
		}

		return addslashes($_POST['ext']);
	}

	public function attach_ajax_actions() {
		foreach ($this->ajax_actions as $action) {
			add_action(
				'wp_ajax_' . $action,
				[$this, $action]
			);
		}
	}
}

