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

namespace Hafenstudios\Leadlotse\Fields\Types;

use Hafenstudios\Leadlotse\Fields\AbstractFieldType;

defined( 'ABSPATH' ) || exit;

/**
 * Zahlenfeld (L-R1): ganze, nicht-negative Zahlen mit optionalem Minimum und
 * Maximum. Eingefuehrt fuer die Begleitpersonen-Anzahl der Zweck-Vorlage
 * "Veranstaltungs-Anmeldung", aber als generischer Feldtyp nutzbar.
 */
final class NumberField extends AbstractFieldType {

	public function key(): string {
		return 'number';
	}

	/**
	 * Bereinigt auf eine ganze Zahl (leer bleibt leer, sonst nur Ziffern).
	 *
	 * @param mixed                $value Rohwert.
	 * @param array<string, mixed> $field Felddefinition.
	 * @return string
	 */
	public function sanitize( $value, array $field ) {
		$value = is_scalar( $value ) ? trim( (string) $value ) : '';
		if ( '' === $value ) {
			return '';
		}
		return (string) absint( $value );
	}

	/**
	 * @param mixed                $value Bereinigter Wert.
	 * @param array<string, mixed> $field Felddefinition.
	 * @return string|null
	 */
	public function validate( $value, array $field ): ?string {
		$error = $this->validate_required( $value, $field );
		if ( null !== $error ) {
			return $error;
		}
		if ( $this->is_empty( $value ) ) {
			return null;
		}

		$number = absint( $value );
		$min    = isset( $field['min'] ) ? absint( $field['min'] ) : 0;
		$max    = isset( $field['max'] ) ? absint( $field['max'] ) : 0;

		if ( $number < $min || ( $max > 0 && $number > $max ) ) {
			return sprintf(
				/* translators: %s: Feldname */
				__( 'Der Wert im Feld "%s" liegt ausserhalb des erlaubten Bereichs. Bitte pruefen Sie die Zahl.', 'leadlotse' ),
				(string) ( $field['label'] ?? $field['id'] ?? '' )
			);
		}
		return null;
	}

	/**
	 * @param array<string, mixed> $field Felddefinition.
	 * @return array<string, mixed>
	 */
	public function render_data( array $field ): array {
		$data        = parent::render_data( $field );
		$data['min'] = isset( $field['min'] ) ? absint( $field['min'] ) : 0;
		$data['max'] = isset( $field['max'] ) ? absint( $field['max'] ) : 0;
		return $data;
	}
}
