<?php
/**
 * @package Hafenstudios\Core
 */

namespace Hafenstudios\Core\Rest;

defined( 'ABSPATH' ) || exit;

/**
 * Generische Basis fuer REST-Controller der Flotte.
 *
 * Buendelt die immer gleichen Berechtigungspruefungen und den einheitlichen
 * Berechtigungsfehler. Anders als die Kurato-lokale Vorlage sind die beiden
 * Capabilities nicht hart verdrahtet, sondern werden pro Controller im
 * Konstruktor gesetzt (Lesen und Verwalten koennen dieselbe Cap sein).
 * Kurato bleibt vorerst auf seiner eigenen Basisklasse (Review-Backlog).
 */
abstract class AbstractController {

	/**
	 * Capability fuer lesende Zugriffe.
	 *
	 * @var string
	 */
	protected string $view_cap;

	/**
	 * Capability fuer schreibende Zugriffe.
	 *
	 * @var string
	 */
	protected string $manage_cap;

	/**
	 * @param string $view_cap   Capability fuer lesende Zugriffe.
	 * @param string $manage_cap Capability fuer schreibende Zugriffe.
	 */
	public function __construct( string $view_cap, string $manage_cap ) {
		$this->view_cap   = $view_cap;
		$this->manage_cap = $manage_cap;
	}

	/**
	 * Lese-Berechtigung (als permission_callback nutzbar).
	 *
	 * @return bool|\WP_Error
	 */
	public function can_view() {
		return current_user_can( $this->view_cap ) ? true : $this->forbidden();
	}

	/**
	 * Schreib-Berechtigung (als permission_callback nutzbar).
	 *
	 * @return bool|\WP_Error
	 */
	public function can_manage() {
		return current_user_can( $this->manage_cap ) ? true : $this->forbidden();
	}

	/**
	 * Einheitlicher Berechtigungsfehler.
	 *
	 * @return \WP_Error
	 */
	protected function forbidden() {
		return new \WP_Error(
			'hafenstudios_forbidden',
			__( 'Sie haben keine Berechtigung fuer diese Aktion. Bitte wenden Sie sich an eine Administratorin oder einen Administrator.', 'hafenstudios-core' ),
			array( 'status' => rest_authorization_required_code() )
		);
	}
}
