<?php
/**
* Class SettingsProcessor
*
* @package WPDesk\FS\TableRate\Rule\Settings
*/
namespace WPDesk\FS\TableRate\Rule\Settings;
use FSVendor\WPDesk\Forms\Field;
use WPDesk\Forms\Field\InputNumberField;
use WPDesk\FS\TableRate\Rule\Condition\Condition;
use WPDesk\FS\TableRate\Rule\Condition\ConditionsFactory;
use WPDesk\FS\TableRate\Rule\Cost\Additional;
use WPDesk\FS\TableRate\Rule\Cost\AdditionalCost;
use WPDesk\FS\TableRate\Rule\Cost\Cost;
use WPDesk\FS\TableRate\Rule\SpecialAction\SpecialAction;
/**
* Can process rules settings.
*/
class SettingsProcessor {
/**
* @var array
*/
private $posted_settings;
/**
* @var Condition[]
*/
private $conditions;
/**
* @var Field[]
*/
private $costs_fields;
/**
* @var Field[]
*/
private $additional_costs_fields;
/**
* @var Field[]
*/
private $special_action_fields;
/**
* SettingsProcessor constructor.
*
* @param array $posted_settings .
* @param Condition[] $conditions .
* @param Field[] $costs_fields .
* @param Field[] $additional_costs_fields .
* @param Field[] $special_action_fields .
*/
public function __construct(
array $posted_settings,
array $conditions,
array $costs_fields,
array $additional_costs_fields,
array $special_action_fields
) {
$this->posted_settings = $posted_settings;
$this->conditions = $conditions;
$this->costs_fields = $costs_fields;
$this->additional_costs_fields = $additional_costs_fields;
$this->special_action_fields = $special_action_fields;
}
/**
* @return array
*/
public function prepare_settings() {
$settings = [];
foreach ( $this->posted_settings as $rule_id => $rule_posted_settings ) {
$rule_settings = [
'conditions' => $this->prepare_conditions( $rule_posted_settings['conditions'] ?? [] ),
];
$rule_settings = $this->prepare_costs( $rule_settings, $rule_posted_settings );
$rule_settings = $this->prepare_costs_additional( $rule_settings, $rule_posted_settings );
$rule_settings = $this->prepare_special_action( $rule_settings, $rule_posted_settings );
$settings[] = $rule_settings;
}
return $settings;
}
/**
* @param array $rule_settings .
* @param array $rule_posted_settings .
*
* @return array
*/
private function prepare_costs( array $rule_settings, array $rule_posted_settings ) {
foreach ( $this->costs_fields as $field ) {
$rule_settings_value = isset( $rule_posted_settings[ $field->get_name() ] ) ? $rule_posted_settings[ $field->get_name() ] : '';
$rule_settings[ $field->get_name() ] = $this->sanitize_and_format_field( $rule_settings_value, $field );
}
return $rule_settings;
}
/**
* @param array $rule_settings .
* @param array $rule_posted_settings .
*
* @return array
*/
private function prepare_costs_additional( array $rule_settings, array $rule_posted_settings ) {
$rule_settings['additional_costs'] = [];
if ( isset( $rule_posted_settings['additional_costs'] ) && is_array( $rule_posted_settings['additional_costs'] ) ) {
foreach ( $rule_posted_settings['additional_costs'] as $posted_additional_cost ) {
$additional_cost = [];
foreach ( $this->additional_costs_fields as $field ) {
$additional_cost_value = isset( $posted_additional_cost[ $field->get_name() ] ) ? $posted_additional_cost[ $field->get_name() ] : '';
$additional_cost[ $field->get_name() ] = $this->sanitize_and_format_field( $additional_cost_value, $field );
}
$rule_settings['additional_costs'][] = $additional_cost;
}
}
return $rule_settings;
}
/**
* @param array $rule_settings .
* @param array $rule_posted_settings .
*
* @return array
*/
private function prepare_special_action( array $rule_settings, array $rule_posted_settings ) {
foreach ( $this->special_action_fields as $field ) {
$rule_settings[ $field->get_name() ] = isset( $rule_posted_settings[ $field->get_name() ] ) ? sanitize_text_field( $rule_posted_settings[ $field->get_name() ] ) : '';
}
return $rule_settings;
}
/**
* @param array $rule_conditions .
*
* @return array
*/
private function prepare_conditions( array $rule_conditions ) {
$conditions = [];
foreach ( $rule_conditions as $rule_condition ) {
$sanitized_condition = sanitize_key( $rule_condition['condition_id'] ?? [] );
$condition_normalized = [ 'condition_id' => $sanitized_condition ];
if ( isset( $this->conditions[ $sanitized_condition ] ) ) {
list( $rule_condition, $condition_normalized ) = $this->prepare_condition_fields( $sanitized_condition, $rule_condition, $condition_normalized );
$conditions[] = $condition_normalized;
}
}
return $conditions;
}
/**
* @param string $sanitized_condition .
* @param array $rule_condition .
* @param array $condition_normalized .
*
* @return array
*/
private function prepare_condition_fields( $sanitized_condition, $rule_condition, array $condition_normalized ) {
foreach ( $this->conditions[ $sanitized_condition ]->get_fields() as $field ) {
$rule_condition_value = isset( $rule_condition[ $field->get_name() ] ) ? $rule_condition[ $field->get_name() ] : '';
$condition_normalized[ $field->get_name() ] = $this->sanitize_and_format_field( $rule_condition_value, $field );
}
return [ $rule_condition, $condition_normalized ];
}
/**
* @param string|array $value .
* @param Field $field .
*/
private function sanitize_and_format_field( $value, $field ) {
if ( $field instanceof Field\InputNumberField ) {
return $this->format_number_field( sanitize_text_field( $value ) );
} else {
return $field->is_multiple() ? array_map( 'sanitize_text_field', is_array( $value ) ? $value : [] ) : sanitize_text_field( $value );
}
}
/**
* @param string $value .
*
* @return string
*/
private function format_number_field( $value ) {
return str_replace( ',', '.', $value );
}
}