<?php
/**
 * VideoPress Settings Endpoint
 *
 * @package automattic/jetpack-videopress
 */

namespace Automattic\Jetpack\VideoPress;

use WP_Error;
use WP_REST_Request;
use WP_REST_Response;
use WP_REST_Server;

/**
 * Rest API class for fetching and setting site settings related to VideoPress.
 */
class VideoPress_Rest_Api_V1_Settings {
	/**
	 * Initializes the endpoints
	 *
	 * @return void
	 */
	public static function init() {
		add_action( 'rest_api_init', array( static::class, 'register_rest_endpoints' ) );
	}

	/**
	 * Register the REST API routes.
	 *
	 * @return void
	 */
	public static function register_rest_endpoints() {
		register_rest_route(
			'videopress/v1',
			'settings',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callback'            => array( static::class, 'get_settings' ),
					'permission_callback' => function () {
						return current_user_can( 'manage_options' );
					},
				),
				array(
					'methods'             => WP_REST_Server::EDITABLE,
					'callback'            => array( static::class, 'update_settings' ),
					'permission_callback' => function () {
						return Data::can_perform_action() && current_user_can( 'manage_options' );
					},
					'args'                => array(
						'videopress_videos_private_for_site' => array(
							'description' => __( 'If the VideoPress videos should be private by default', 'jetpack-videopress-pkg' ),
							'type'        => 'boolean',
						),
						'videopress_auto_subtitles_disabled' => array(
							'description' => __( 'If auto-generated subtitles should be skipped for new videos', 'jetpack-videopress-pkg' ),
							'type'        => 'boolean',
						),
					),
				),
			)
		);
	}

	/**
	 * Returns the value of the VideoPress settings.
	 *
	 * @return WP_Rest_Response - The response object.
	 */
	public static function get_settings() {
		$has_connected_owner = Data::has_connected_owner();
		if ( ! $has_connected_owner ) {
			return rest_ensure_response(
				new WP_Error(
					'owner_not_connected',
					'User not connected.',
					array(
						'code'        => 503,
						'connect_url' => Admin_UI::get_admin_page_url(),
					)
				)
			);
		}

		$blog_id = Data::get_blog_id();
		if ( ! $blog_id ) {
			return rest_ensure_response(
				new WP_Error( 'site_not_registered', 'Site not registered.', 503 )
			);
		}

		$status = 200;
		$data   = Data::get_videopress_settings();

		return rest_ensure_response(
			new WP_REST_Response( $data, $status )
		);
	}

	/**
	 * Updates the value of the VideoPress settings when a new value
	 * is present on the request body.
	 *
	 * @param WP_REST_Request $request the request object.
	 * @return WP_Rest_Response - The response object.
	 */
	public static function update_settings( $request ) {
		$has_connected_owner = Data::has_connected_owner();
		if ( ! $has_connected_owner ) {
			return rest_ensure_response(
				new WP_Error(
					'owner_not_connected',
					'User not connected.',
					array(
						'code'        => 503,
						'connect_url' => Admin_UI::get_admin_page_url(),
					)
				)
			);
		}

		$blog_id = Data::get_blog_id();
		if ( ! $blog_id ) {
			return rest_ensure_response(
				new WP_Error( 'site_not_registered', 'Site not registered.', 503 )
			);
		}

		$private_for_site        = $request->get_param( 'videopress_videos_private_for_site' );
		$auto_subtitles_disabled = $request->get_param( 'videopress_auto_subtitles_disabled' );

		if ( null !== $private_for_site ) {
			update_option( 'videopress_private_enabled_for_site', $private_for_site );
		}

		if ( null !== $auto_subtitles_disabled ) {
			update_option( 'videopress_auto_subtitles_disabled', $auto_subtitles_disabled );
		}

		return rest_ensure_response(
			array(
				'code'    => 'success',
				'message' => __( 'VideoPress settings updated successfully.', 'jetpack-videopress-pkg' ),
				'data'    => 200,
			)
		);
	}
}
