<?php
/**
 * Puente de trazabilidad para opciones del catálogo de etiquetas (tipos, tamaños, mercados).
 *
 * @package Logistica
 */

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

/**
 * Registra eliminación/restauración en papelera central sin duplicar lógica de ocultar.
 */
class Logistica_Label_Option_Lifecycle {

	/**
	 * @param string               $kind  tipo|tamano|mercado.
	 * @param string               $key   Clave estable.
	 * @param string               $label Etiqueta visible.
	 * @param array<string, mixed> $payload Snapshot para restaurar.
	 * @return void
	 */
	public static function record_remove( $kind, $key, $label, $payload ) {
		$kind = sanitize_key( (string) $kind );
		$key  = sanitize_key( (string) $key );
		if ( '' === $kind || '' === $key ) {
			return;
		}

		$payload['_storage'] = 'option';
		$payload['kind']     = $kind;
		$payload['key']      = $key;

		Logistica_Entity_Lifecycle::record_delete(
			'etiqueta_catalog',
			'opcion',
			self::entity_id( $kind, $key ),
			$payload,
			$label ?: $key
		);
	}

	/**
	 * @param string $kind tipo|tamano|mercado.
	 * @param string $key  Clave.
	 * @return string
	 */
	public static function entity_id( $kind, $key ) {
		$kind = sanitize_key( (string) $kind );
		if ( 'tamano' === $kind ) {
			$key = Logistica_Label_Etiqueta_Tamanos::normalize_label( $key );
			return $kind . ':' . md5( strtolower( $key ) );
		}

		return $kind . ':' . sanitize_key( (string) $key );
	}

	/**
	 * @param string               $kind    tipo|tamano|mercado.
	 * @param string               $key     Clave.
	 * @param array<string, mixed> $payload Snapshot papelera.
	 * @return true|WP_Error
	 */
	public static function restore_from_payload( $kind, $key, $payload ) {
		$kind = sanitize_key( (string) $kind );
		if ( '' === $kind ) {
			return new WP_Error( 'invalid_kind', __( 'Tipo de opción no válido.', 'logistica' ) );
		}

		switch ( $kind ) {
			case 'tipo':
				return Logistica_Label_Etiqueta_Tipos::apply_restore_from_payload( $payload );
			case 'tamano':
				return Logistica_Label_Etiqueta_Tamanos::apply_restore_from_payload( $payload );
			case 'mercado':
				return Logistica_Label_Etiqueta_Mercados::apply_restore_from_payload( $payload );
			default:
				return new WP_Error( 'unsupported', __( 'Opción de catálogo no soportada.', 'logistica' ) );
		}
	}

	/**
	 * @param string $kind  tipo|tamano|mercado.
	 * @param string $key   Clave.
	 * @param string $label Etiqueta.
	 * @return void
	 */
	public static function record_restore( $kind, $key, $label = '' ) {
		$kind = sanitize_key( (string) $kind );
		$key  = sanitize_key( (string) $key );
		if ( '' === $kind || '' === $key ) {
			return;
		}

		Logistica_Audit::log(
			array(
				'module_key'  => 'etiqueta_catalog',
				'entity_type' => 'opcion',
				'entity_id'   => self::entity_id( $kind, $key ),
				'action'      => 'restore',
				'summary'     => sprintf(
					/* translators: 1: option kind, 2: label */
					__( 'Opción de catálogo restaurada (%1$s: %2$s)', 'logistica' ),
					$kind,
					$label ?: $key
				),
			)
		);
	}
}
