<?php
/** Verified write abilities for WooCommerce product shipping classes. */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

function wpagent_ability_upsert_product_shipping_class(): array {
	return array(
		'label'               => __( 'Produkt-Versandklasse anlegen oder aktualisieren', 'wp-agent-companion' ),
		'description'         => __( 'Schreibt eine WooCommerce-Produkt-Versandklasse konfliktgeschützt, mit Sperre und Read-back-Verifikation. Nicht exakt bestätigte Schreibvorgänge werden ohne weitere Mutation zur manuellen Prüfung abgelehnt.', 'wp-agent-companion' ),
		'category'            => 'wp-agent',
		'input_schema'        => array(
			'type'                 => 'object',
			'properties'           => array(
				'shipping_class_id'  => array( 'type' => 'integer', 'minimum' => 1 ),
				'expected_state_hash' => array( 'type' => 'string', 'pattern' => '^[a-f0-9]{64}$' ),
				'name'               => array( 'type' => 'string', 'minLength' => 1, 'maxLength' => 200 ),
				'slug'               => array( 'type' => 'string', 'minLength' => 1, 'maxLength' => 200 ),
				'description'        => array( 'type' => 'string', 'maxLength' => 5000 ),
			),
			'additionalProperties' => false,
		),
		'output_schema'       => array(
			'type'                 => 'object',
			'properties'           => array(
				'shipping_class' => wpagent_wc_shipping_class_schema(),
				'created'        => array( 'type' => 'boolean' ),
				'verified'       => array( 'type' => 'boolean' ),
			),
			'required'             => array( 'shipping_class', 'created', 'verified' ),
			'additionalProperties' => false,
		),
		'execute_callback'    => 'wpagent_exec_upsert_product_shipping_class',
		'permission_callback' => 'wpagent_perm_wc_manage_shipping_classes',
		'meta'                => array( 'show_in_rest' => true, 'annotations' => array( 'readonly' => false, 'destructive' => false, 'idempotent' => false ) ),
	);
}

/** @return array<string,mixed>|WP_Error */
function wpagent_exec_upsert_product_shipping_class( $input ) {
	$permitted = wpagent_wc_require_shipping_class_permission();
	if ( is_wp_error( $permitted ) ) {
		return $permitted;
	}
	$available = wpagent_wc_require_shipping_class_runtime();
	if ( is_wp_error( $available ) ) {
		return $available;
	}
	$input             = is_array( $input ) ? $input : array();
	$shipping_class_id = absint( $input['shipping_class_id'] ?? 0 );
	$creating          = 0 === $shipping_class_id;
	$lock              = wpagent_wc_shipping_class_acquire_lock();
	if ( is_wp_error( $lock ) ) {
		return $lock;
	}
	try {
		$term     = $creating ? null : wpagent_wc_shipping_class_record( $shipping_class_id );
		$previous = $term ? wpagent_wc_shipping_class_payload_for_term( $term ) : null;
		if ( is_wp_error( $previous ) ) {
			return $previous;
		}
		if ( ! $creating && ! $previous ) {
			return new WP_Error( 'wpagent_wc_shipping_class_not_found', __( 'WooCommerce-Produkt-Versandklasse nicht gefunden.', 'wp-agent-companion' ), array( 'status' => 404 ) );
		}
		if ( ! $creating ) {
			$expected_hash = strtolower( (string) ( $input['expected_state_hash'] ?? '' ) );
			if ( ! preg_match( '/^[a-f0-9]{64}$/', $expected_hash ) || ! hash_equals( $previous['state_hash'], $expected_hash ) ) {
				return new WP_Error( 'wpagent_wc_shipping_class_conflict', __( 'Die Versandklasse hat sich seit dem Lesen geändert. Lies sie neu und wiederhole den Vorgang.', 'wp-agent-companion' ), array( 'status' => 409, 'current_hash' => $previous['state_hash'] ) );
			}
		}
		$next = wpagent_wc_validate_shipping_class_fields( $input, $creating, $previous );
		if ( is_wp_error( $next ) ) {
			return $next;
		}
		$unique = wpagent_wc_shipping_class_require_unique_fields( $next, $creating ? 0 : $shipping_class_id );
		if ( is_wp_error( $unique ) ) {
			return $unique;
		}
		try {
			$result = $creating
				? wp_insert_term( $next['name'], WPAGENT_WC_SHIPPING_CLASS_TAXONOMY, array( 'slug' => $next['slug'], 'description' => $next['description'] ) )
				: wp_update_term( $shipping_class_id, WPAGENT_WC_SHIPPING_CLASS_TAXONOMY, $next );
		} catch ( Throwable $error ) {
			return new WP_Error( 'wpagent_wc_shipping_class_recovery_required', __( 'WooCommerce hat beim Schreiben der Versandklasse einen Fehler ausgelöst. Der möglicherweise teilweise geänderte Zustand wurde absichtlich nicht weiter verändert. Prüfe ihn sofort manuell.', 'wp-agent-companion' ), array( 'status' => 500 ) );
		}
		if ( is_wp_error( $result ) ) {
			return $result;
		}
		$shipping_class_id = $creating ? absint( $result['term_id'] ?? 0 ) : absint( $result['term_id'] ?? $shipping_class_id );
		if ( $shipping_class_id <= 0 ) {
			return new WP_Error( 'wpagent_wc_shipping_class_recovery_required', __( 'WooCommerce hat den Schreibvorgang ohne eine gültige Versandklassen-ID bestätigt. Der Zustand wurde nicht weiter verändert. Prüfe ihn sofort manuell.', 'wp-agent-companion' ), array( 'status' => 500 ) );
		}
		wpagent_wc_shipping_class_refresh( $shipping_class_id );
		$fresh_term = wpagent_wc_shipping_class_record( $shipping_class_id );
		if ( ! $fresh_term ) {
			return new WP_Error( 'wpagent_wc_shipping_class_recovery_required', __( 'Der Zustand der Versandklasse konnte nach dem erfolgreich bestätigten Schreiben nicht sicher gelesen werden. Er wurde nicht weiter verändert. Prüfe ihn sofort manuell.', 'wp-agent-companion' ), array( 'status' => 500 ) );
		}
		$fresh = wpagent_wc_shipping_class_payload_for_term( $fresh_term );
		if ( is_wp_error( $fresh ) ) {
			return new WP_Error( 'wpagent_wc_shipping_class_recovery_required', __( 'Der Zustand der Versandklasse konnte nach dem erfolgreich bestätigten Schreiben nicht sicher geprüft werden. Er wurde nicht weiter verändert. Prüfe ihn sofort manuell.', 'wp-agent-companion' ), array( 'status' => 500 ) );
		}
		foreach ( array( 'shipping_class_id', 'name', 'slug', 'description' ) as $field ) {
			$expected = 'shipping_class_id' === $field ? $shipping_class_id : $next[ $field ];
			if ( $fresh[ $field ] !== $expected ) {
				return new WP_Error( 'wpagent_wc_shipping_class_recovery_required', __( 'Die Versandklasse weicht nach dem erfolgreich bestätigten Schreiben ab. Sie wurde absichtlich nicht weiter verändert. Prüfe sie sofort manuell.', 'wp-agent-companion' ), array( 'status' => 500 ) );
			}
		}
		return array( 'shipping_class' => $fresh, 'created' => $creating, 'verified' => true );
	} finally {
		wpagent_wc_shipping_class_release_lock( $lock );
	}
}
