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

namespace Hafenstudios\Leadlotse\Fields;

defined( 'ABSPATH' ) || exit;

/**
 * Gemeinsame Basis der Feldtypen: Pflichtfeld-Pruefung und Standard-Render-Daten.
 */
abstract class AbstractFieldType implements FieldType {

	/**
	 * Standard-Sanitizing: einzeiliger Text.
	 *
	 * @param mixed                $value Rohwert.
	 * @param array<string, mixed> $field Felddefinition.
	 * @return string
	 */
	public function sanitize( $value, array $field ) {
		if ( is_array( $value ) ) {
			$value = implode( ', ', array_map( 'strval', $value ) );
		}
		return sanitize_text_field( (string) $value );
	}

	/**
	 * Standard-Validierung: nur Pflichtfeld.
	 *
	 * @param mixed                $value Bereinigter Wert.
	 * @param array<string, mixed> $field Felddefinition.
	 * @return string|null
	 */
	public function validate( $value, array $field ): ?string {
		return $this->validate_required( $value, $field );
	}

	/**
	 * Standard-Render-Daten.
	 *
	 * @param array<string, mixed> $field Felddefinition.
	 * @return array<string, mixed>
	 */
	public function render_data( array $field ): array {
		return array(
			'id'          => (string) ( $field['id'] ?? '' ),
			'type'        => $this->key(),
			'label'       => (string) ( $field['label'] ?? '' ),
			'required'    => ! empty( $field['required'] ),
			'help'        => (string) ( $field['help'] ?? '' ),
			'placeholder' => (string) ( $field['placeholder'] ?? '' ),
			'default'     => $field['default'] ?? '',
			'conditions'  => is_array( $field['conditions'] ?? null ) ? $field['conditions'] : array(),
		);
	}

	/**
	 * Prueft die Pflichtfeld-Regel.
	 *
	 * @param mixed                $value Wert.
	 * @param array<string, mixed> $field Felddefinition.
	 * @return string|null
	 */
	protected function validate_required( $value, array $field ): ?string {
		$is_empty = is_array( $value ) ? array() === $value : '' === trim( (string) $value );
		if ( ! empty( $field['required'] ) && $is_empty ) {
			return sprintf(
				/* translators: %s: Feldname */
				__( 'Das Feld "%s" ist ein Pflichtfeld. Bitte fuellen Sie es aus.', 'leadlotse' ),
				(string) ( $field['label'] ?? $field['id'] ?? '' )
			);
		}
		return null;
	}

	/**
	 * Ist der Wert leer (dann greifen Format-Pruefungen nicht)?
	 *
	 * @param mixed $value Wert.
	 * @return bool
	 */
	protected function is_empty( $value ): bool {
		return is_array( $value ) ? array() === $value : '' === trim( (string) $value );
	}
}
